在Node.JS中使用Bluebird Promise和2个asynchronous操作
我有一个场景,我需要从MySQL数据库中获取logging,并在rediscaching中更新,并closuresMySQL和Redis连接。
脚步:
- 打开MySQL连接
- 从成功的MySQL数据库中获取logging
- 从MySQL查询结果成功更新Rediscaching
- closuresMySQL数据库连接。
我正在尝试使用蓝鸟承诺,但没有得到适当的结果。
下面的代码中的问题是最初被调用,甚至在最后应该执行的processBreakingNewsData函数中。
请在我犯错的地方纠正我
以下是我的node.js代码
constants.js文件
var Promise = require('bluebird'); module.exports = { getRedisConnection: function () { return require("redis").createClient(6379, 'XXXX', { auth_pass: 'XXXX' }); }, getMySqlConnection: function () { var conObj = { host: "localhost", user: "root", password: "", database: "deccan" }; var connection = require("mysql").createConnection(conObj); return new Promise(function (resolve, reject) { connection.connect(function (error) { if (error) reject(error); else resolve(connection); }); }); } };
testing.js文件
var constants = require("./constants.js"); var Promise = require('bluebird'); constants.getMySqlConnection().then(processBreakingNewsData) .catch(function (e) { console.log("Error : " + e); }).done(function () { console.log("Finished"); }); function processBreakingNewsData(connection) { return new Promise(function (resolve, reject) { connection.query("select id, text, DATE_FORMAT(created_at, '%Y-%m-%d %H:%i:%s') as 'created_at' from breakingnews;", function (error, results) { connection.end(); if (error) reject(error); else resolve(results); }); }).then(function (results) { return new Promise(function (resolve, reject) { var value = ""; if (results.length > 0) value = JSON.stringify(results); var client = constants.getRedisConnection(); client.set("bnews", value, function (err, reply) { if (err) reject(new Error("Error during Update of BreakingNews : " + err)); else resolve(reply); }); }); }).catch(function (e) { console.log("Error during Update of BreakingNews : " + e); }).done(function (result) { console.log("Breaking News Updated in Redis."); }); }
这里有两个问题:
-
then
总是回报一个承诺
.then
总是回报一个承诺。 如果你自己没有返回一个,则用返回值创build一个已解决的承诺。 这就是在这里发生的:然后在processBreakingNewsData
立即返回一个已解决的承诺,然后执行您的完成callback。
为了避免这一点,你需要明确地返回一个持续的承诺:
function processBreakingNewsData(connection) { return new Promise(function (resolve, reject) { // ... }).then(function (results) { return new Promise(function (resolve, reject) { // ...
-
done
不返回一个承诺
您上次done
处理程序不返回承诺,这意味着整个processBreakingNewsData
不会返回承诺。 所以,再次,调用then
立即返回一个解决的承诺。
永远不要用完。 这是从文档:
.done( [function(any value) fulfilledHandler], [function(any error) rejectedHandler] ) -> undefined
这种方法的使用非常令人沮丧,它只是出于历史原因而存在。
您可以安全地replacedone
这里,因为你事先发现错误。