如何向Bluebird推荐使用另一个promisified api的javascript api?

如何向Bluebird推荐使用另一个promisified api的javascript api?,javascript,promise,bluebird,Javascript,Promise,Bluebird,我有点纠结于此。我想在节点中的数据库驱动程序模块上构建一个抽象层。我已经通过执行以下操作来实现驱动程序模块: var sql = Promise.promisifyAll(require('sql-driver')); 然后,在我自己的js文件中,我希望像这样包装查询: function query(queryString, transaction) { sql.connectAsync(config).then(function() { var req = new sql

我有点纠结于此。我想在节点中的数据库驱动程序模块上构建一个抽象层。我已经通过执行以下操作来实现驱动程序模块:

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);
      });
   });
}
我如何承诺(使用bluebird),以便我的查询函数也被承诺并返回承诺或表

更新:

我希望我的包装器方法也得到认可,以便用户可以执行以下操作:

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);
    });
}
我确信这不是有效的代码,只是试图传达想法。此外,本例仅显示一个查询,而不显示提交方法,提交方法也是包装器的一部分。有人能给我举一个例子,使用承诺来完成一个完整的事务,并使用多个查询,然后在没有错误的情况下进行“提交”吗

更新2:

下面的idbehold示例不允许我在假设我们此时不关心事务的情况下执行此类操作,只需要一个简单的查询:

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

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

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


你不需要“promisify”,你只需要
返回你已经在使用的承诺。正如bergi所说,如果你想让你的函数“promisify”,承诺通过返回值起作用只需从它那里返回一个承诺即可。您的
getData
仍然不是
return
myDbWrapper。startTransactiongetData只是一个用于测试的函数。我的示例与getData几乎没有关系。我想知道如何构造包装器调用,例如query、startTransaction,以及在进行基于承诺的事务时如何使用它们。你不需要“promisify”,只需要
返回你已经使用过的承诺。正如bergi所说,承诺通过返回值起作用-如果你希望你的函数是“允诺“只需从它那里返回一个承诺即可。您的
getData
仍然不是
return
myDbWrapper。startTransactiongetData只是一个用于测试的函数。我的示例与getData几乎没有关系。我想知道如何构造包装调用,例如query、startTransaction,以及在进行基于承诺的事务时如何使用它们。但我希望我的包装也得到承诺。此示例正在向查询的调用者返回字符串。@u84six调用此函数将返回一个承诺。那么,您能告诉我在更新的示例中如何使用查询方法和startTransaction方法吗?@u84six好的,
query
函数只接受一个参数,所以我不确定为什么在示例代码中要将
事务
传递给它。除此之外,您编写的代码应该可以正常工作。@u84six那么您的示例代码应该完全按照您的预期工作。我相信你不需要做任何修改,但我希望我的包装纸也能得到保证。此示例正在向查询的调用者返回字符串。@u84six调用此函数将返回一个承诺。那么,您能告诉我在更新的示例中如何使用查询方法和startTransaction方法吗?@u84six好的,
query
函数只接受一个参数,所以我不确定为什么在示例代码中要将
事务
传递给它。除此之外,您编写的代码应该可以正常工作。@u84six那么您的示例代码应该完全按照您的预期工作。我认为你不需要做任何修改,你不需要做。将现有的承诺包装到另一个承诺中只会增加内存使用和代码行。我无法让您的示例正常工作。你能给我一个如何在你的例子中使用查询方法的例子吗?我已经编辑了你的文章,向你展示了等效的函数,而没有创建新的承诺。你不需要这样做。将现有的承诺包装到另一个承诺中只会增加内存使用和代码行。我无法让您的示例正常工作。你能给我一个如何在你的例子中使用查询方法的例子吗?我编辑了你的文章,向你展示了等效的函数,而没有创建新的承诺。