在节点js中使用Promise

我在nodejs中是新的。 我已经开始学习nodejs了。 我想在nodejs中使用promise。 我已经成功安装bluebird.Cureently我的代码看起来:

req.getConnection(function(err,connection){ var query = connection.query('SELECT node_questions.question_name,node_questions.description FROM node_questions LEFT JOIN node_user ON node_questions.user_id=node_user.id;SELECT * FROM node_user ORDER BY points DESC LIMIT 5',function(err,rows) { var data =rows[0]; var data2 = rows[1]; console.log(data); console.log(data2); res.render('index', { page_title: 'Welcome',session:req.session.userId,email:req.session.email,data:data,data2:data2}); }); }); }; 

我想在这里使用承诺。 我能怎么做。

请帮忙…

使用Bluebird,你可以使用它的.promisify()方法来创build遵循nodejs调用约定的任何asynchronous函数的promisified版本。 在这种情况下,你可以这样做:

 var Promise = require('bluebird'); var getConnection = Promise.promisify(req.getConnection, req); getConnection().then(function(connection) { var query = Promise.promisify(connection.query, connection); return query('SELECT node_questions.question_name,node_questions.description FROM node_questions LEFT JOIN node_user ON node_questions.user_id=node_user.id;SELECT * FROM node_user ORDER BY points DESC LIMIT 5'); }).spread(function(rows, fields) { // process result here console.log("rows = ", rows); var data = rows[0]; var data2 = rows[1]; console.log(data); console.log(data2); res.render('index', { page_title: 'Welcome', session: req.session.userId, email: req.session.email, data: data, data2: data2 }); }, function(err) { // process error here }); 

通常当你想转换某些东西来使用promise时,你可以在模块中“promisify”你的函数一次,然后在模块的其余部分中使用这个promised的版本,如上面为getConnection()函数所示。 connection.query()大小写有点独特,因为connection对象是一个dynamic创build的对象,所以每次创build一个新的连接对象时都必须对其进行提示。

虽然通常情况下更好地提出asynchronous操作的每个阶段(正如我上面所做的那样),因为它使得更清晰,更一致的error handling和错误传播,也可以将所有传统的callback函数包装成一个这样的promise (尽pipe一个强有力的实现也需要在内部捕捉exception,并把它们变成被拒绝的承诺,但是你可以在这里看到一般的想法):

 new Promise(function (resolve, reject) { req.getConnection(function (err, connection) { if (err) return reject(err); var query = connection.query('SELECT node_questions.question_name,node_questions.description FROM node_questions LEFT JOIN node_user ON node_questions.user_id=node_user.id;SELECT * FROM node_user ORDER BY points DESC LIMIT 5', function (err, rows, fields) { if (err) reject(err); else resolve(rows); }); }); }).then(function(rows) { // process result here var data = rows[0]; var data2 = rows[1]; console.log(data); console.log(data2); res.render('index', { page_title: 'Welcome', session: req.session.userId, email: req.session.email, data: data, data2: data2 }); }, function(err) { // process error here }); 
 var promise = require('bluebird'); var getRows = function () { var deferred = promise.pending(); var query = connection.query('SELECT node_questions.question_name,node_questions.description FROM node_questions LEFT JOIN node_user ON node_questions.user_id=node_user.id;SELECT * FROM node_user ORDER BY points DESC LIMIT 5',function(err,rows) { if(!err) deferred.fulfill(rows); else deferred.reject(err.message); }); return deferred.promise; } 

你可以调用下面的函数。

 getRows() .then(function(rows) { // make somethings with rows data here }) .catch(function(err) { // you can get rejected data here })