在节点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 })