简体   繁体   English

如何使自己的Javascript API与Bluebird一起使用另一个Promisified API?

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

I'm struggling with this a bit. 我为此感到挣扎。 I want to build an abstraction layer over a database driver module in node. 我想在节点的数据库驱动程序模块上构建一个抽象层。 I've already promisified the driver module by doing the following: 我已经通过执行以下操作来实现驱动程序模块的承诺:

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

Then within my own js file I want to wrap queries like so: 然后在我自己的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);
      });
   });
}

How can I promisify (using bluebird) so that my query function is also promisified and returns a promise or thenable? 我如何承诺(使用bluebird),以便我的查询函数也承诺并返回promise或thenable?

Update: 更新:

I want my wrapper method to also be promisified so that the user can do something like this: 我希望我的包装器方法也被允许,以便用户可以执行以下操作:

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

I'm sure this isn't working code, just trying to convey the idea. 我确定这不是工作代码,只是试图传达想法。 Also, this example only shows one query and doesn't show the commit method, which is also part of the wrapper. 另外,此示例仅显示一个查询,没有显示commit方法,这也是包装器的一部分。 Can someone show me an example use promises to do a whole transaction with more than one query and then a 'commit' if no errors? 有人可以给我展示一个例子吗?使用promises可以用一个以上的查询完成整个事务,如果没有错误,然后执行“ commit”?

Update 2: 更新2:

idbehold's example below won't allow me to do this type of thing assuming that we don't care about a transaction at this time, just a simple query: 假设我们目前不关心交易,下面的idbehold的示例将不允许我做这种事情,只是一个简单的查询:

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

How can I enable my query method to work that way? 如何启用查询方法那样工作?

Update 3: 更新3:

I've found my answer. 我找到了答案。 See below. 见下文。

Just return that promise: 只要兑现承诺:

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

Ok, I figured it out and it was right in front of my face. 好的,我弄清楚了,它就在我的面前。 It was my lack of understanding about Promises. 这是我对诺言的缺乏理解。 Most responses were correct about returning a promise, but I shouldn't return the promise I'm using, I need to create a new promise like so: 大多数响应对于返回诺言都是正确的,但是我不应该返回正在使用的诺言,我需要像这样创建一个新的诺言:

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

Edit, without creating a new promise: 编辑,而不创建新的承诺:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM