如何在Node.js中实现Bluebird Promise

3

我尝试使用Node.js的Bluebird Promise,但我无法在then函数中使用resolve和reject方法。以下是我的调用Promise的代码:

  modules.modelClip.exGetAllClips(sUserData)
            .then(function(finalResult) {
                  console.log("Final result " + finalResult)
            })
            .error(function(e) {
                  console.log("Error handler " + e)
            })
            .catch(function(e) {
                  console.log("Catch handler " + e)
            });

在exGetAllClips函数中,我返回了一个Promise。

exports.exGetAllClips = function(pUserData) {
      console.log("---   inside : clipModel : exGetAllClips   -----------------------------------------------------");
      console.log(pUserData);

      return new modules.promise(function(resolve, reject) {
            modules.dbConnection.getConnection(function(rErrorCon, connection) {
                  if (rErrorCon) {
                        reject(rErrorCon);
                  } else {
                        resolve(connection);
                  }
            });
      }).then(function(connection) {
            console.log('Result 4 ')
            var sClipQuery = "CALL spGetAllClips(?)";
            var query = connection.query(sClipQuery, [pUserData.selfId
            ]);
            query.on('error', function(err) {
                  // Handle error, an 'end' event will be emitted after this as well
                  //return err;
                  console.log(" error : spGetAllClips : ",err);
                 reject(err);
            }).on('result', function(row) {
                  console.log("row : ", JSON.stringify(row));
                  resolve( row);
            }).on('end', function() {
                  // all rows have been received
                  connection.release();
            })

      });
};

我希望如果存在错误,可以从.then中抛出错误。但是无法做到这一点,它会抛出错误拒绝是undefined

请帮忙解决,如何实现或者其他方法。

1个回答

1

我希望这样做,首先有两个回调函数(其中一个实际上是事件处理程序,我不太喜欢使用Promises来处理它),因此将它们拆分为两个Promise:

  • use getConnectionAsync instead of getConnection by promisifying the whole module.

  • follow bluebird docs for handling one time events( mind you, I am not maintaining a flag to check if promise is already resolved), the code could be like:

     modules.dbConnection = modules.promise.promisifyAll(modules.dbConnection);
     ...
    
     exports.exGetAllClips = function(pUserData) {
       console.log("---   inside : clipModel : exGetAllClips   -----------------------------------------------------");
       console.log(pUserData);
    
       return modules.dbConnection.getConnectionAsync()
         .then(function(connection) {
           console.log('Result 4 ')
           var sClipQuery = "CALL spGetAllClips(?)";
           return new modules.promise(function(resolve, reject){
               var query = connection.query(sClipQuery, [pUserData.selfId]);
               query.on('error', function(err) {
                 // Handle error, an 'end' event will be emitted after this as well
                 //return err;
                 console.log(" error : spGetAllClips : ",err);
                  reject(err);
               }).on('result', function(row) {
                 console.log("row : ", JSON.stringify(row));
                 resolve( row);
               }).on('end', function() {
                 // all rows have been received
                 connection.release();
               });
           });
     };
    

是的,这就是我想要的,即使我参考了类似的例子,http://zpalexander.com/blog/javascript-promises-node-js/。 - pitu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接