在节点 js 中使用 Promises

Use Promises in node js

我是 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});
         });

    });
};

我想在这里使用 promises。我该怎么办。

请帮忙...

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
})

使用 Bluebird,您可以使用它的 .promisify() 方法制作任何遵循 nodejs 调用约定的异步函数的承诺版本。在这种情况下,您可以这样做:

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
});

通常当你想将某些东西转换为使用 promises 时,你可以 "promisify" 你的函数只在一个模块中使用一次,然后在模块的其余部分使用那个 promisified 版本,就像上面显示的 getConnection() 函数。 connection.query() 的情况有点独特,因为 connection 对象是一个动态创建的对象,因此每次创建新的连接对象时都必须对它进行承诺。

虽然承诺异步操作的每个阶段通常更好(正如我在上面所做的那样),因为它可以使错误处理和错误传播更清晰、更一致,但您也可以只包装所有传统的回调内容变成这样的一个承诺(尽管一个健壮的实现也需要在内部捕获异常并将它们变成被拒绝的承诺,但你可以在这里看到总体思路):

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
});