在Node.JS中使用Bluebird Promise和2个asynchronous操作

我有一个场景,我需要从MySQL数据库中获取logging,并在rediscaching中更新,并closuresMySQL和Redis连接。

脚步:

  1. 打开MySQL连接
  2. 从成功的MySQL数据库中获取logging
  3. 从MySQL查询结果成功更新Rediscaching
  4. 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."); }); } 

这里有两个问题:

  1. then总是回报一个承诺

.then总是回报一个承诺。 如果你自己没有返回一个,则用返回值创build一个已解决的承诺。 这就是在这里发生的:然后在processBreakingNewsData立即返回一个已解决的承诺,然后执行您的完成callback。

为了避免这一点,你需要明确地返回一个持续的承诺:

 function processBreakingNewsData(connection) { return new Promise(function (resolve, reject) { // ... }).then(function (results) { return new Promise(function (resolve, reject) { // ... 
  1. done不返回一个承诺

您上次done处理程序不返回承诺,这意味着整个processBreakingNewsData不会返回承诺。 所以,再次,调用then立即返回一个解决的承诺。

永远不要用完。 这是从文档:

 .done( [function(any value) fulfilledHandler], [function(any error) rejectedHandler] ) -> undefined 

这种方法的使用非常令人沮丧,它只是出于历史原因而存在。

您可以安全地replacedone这里,因为你事先发现错误。