如何通过Bluebird承诺您自己的javascript api,该api使用另一个承诺的api

How to promisify your own javascript api which uses another promisified api with Bluebird?

本文关键字:api 一个承诺 承诺 Bluebird 自己的 javascript 何通过      更新时间:2023-09-26

我有点挣扎。我想在节点中的数据库驱动程序模块上构建一个抽象层。我已经通过以下操作承诺了驱动程序模块:

var sql = Promise.promisifyAll(require('sql-driver'));

然后在我自己的js文件中,我想像这样包装查询:

function query(queryString, transaction) {
   sql.connectAsync(config).then(function() {
      var req = new sql.Request(transaction);
      req.queryAsync(queryString).then(function(resultSet)) {
          console.log(resultSet);
      });
   });
}

如何promisify(使用bluebird)使我的查询函数也被promisify并返回promise或theable?

更新:

我希望我的包装器方法也能被承诺,这样用户就可以做这样的事情:

var myDbWrapper = require('my-db-wapper');
function getData() {
    myDbWrapper.startTransaction()
    .then(function(transaction) {
        return myDbWrapper.query('select 1 as number', transaction);
     })
    .then(function(resultSet) {
        console.log(resultSet);
     }).
    .catch(function(e) {
        console.error(e);
    });
}

我确信这不是工作代码,只是试图传达这个想法。此外,这个例子只显示了一个查询,没有显示提交方法,提交方法也是包装器的一部分。有人能给我举一个例子吗?使用promise来完成一个包含多个查询的完整事务,如果没有错误,则执行"提交"?

更新2:

假设我们现在不关心交易,只是一个简单的查询:

myDbWrapper.query(queryString, undefined)
.then(function(recordSet) {
   console.log(recordSet);
})
.catch(function(err) {
   console.error(err);
});

如何使我的查询方法以这种方式工作?

更新3:

我找到了答案。请参见下文。

只需返回承诺:

function query(queryString, transaction) {
   return sql.connectAsync(config).then(function() {
      var req = new sql.Request(transaction);
      return req.queryAsync(queryString);
   }).then(function(resultSet)) {        // You don't actually
      console.log(resultSet);            // need this this part
      return resultSet;                  // unless you need to log
   });
}

好吧,我想明白了,它就在我面前。这是我对承诺缺乏理解。关于返回承诺,大多数回复都是正确的,但我不应该返回我正在使用的承诺,我需要创建一个新的承诺,如下所示:

function query (queryString, transaction) {
   return new Promise(function(resolve, reject) {
        var req = new sql.Request(transaction);
        req.queryAsync(queryString).then(function(resultSet) {
            resolve(resultSet);
        })
        .catch(function(err) {
            reject(err);
        });
    });
}

编辑,不创建新的承诺:

function query (queryString, transaction) {
  var req = new sql.Request(transaction);
  return req.queryAsync(queryString);
}