【问题标题】:how to implement bluebird promise in nodejs如何在nodejs中实现bluebird promise
【发布时间】:2016-05-21 19:35:06
【问题描述】:

我尝试了 node 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 函数中返回承诺。

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

请帮忙,如何实现这个或任何其他方式。

【问题讨论】:

    标签: javascript node.js callback promise bluebird


    【解决方案1】:

    我想要这样,首先有两个回调(一个实际上是一个 eventHandler,我不太习惯使用 Promises 来处理它),所以将它们分成两个 Promise:

    • 通过承诺整个模块使用getConnectionAsync 而不是getConnection

    • 关注bluebird docs 处理一次性事件(请注意,我没有维护一个标志来检查承诺是否已经解决),代码可能如下:

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

    【讨论】:

    猜你喜欢
    • 2015-11-13
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多