簡體   English   中英

如何使自己的Javascript API與Bluebird一起使用另一個Promisified API?

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

我為此感到掙扎。 我想在節點的數據庫驅動程序模塊上構建一個抽象層。 我已經通過執行以下操作來實現驅動程序模塊的承諾:

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),以便我的查詢函數也承諾並返回promise或thenable?

更新:

我希望我的包裝器方法也被允許,以便用戶可以執行以下操作:

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

我確定這不是工作代碼,只是試圖傳達想法。 另外,此示例僅顯示一個查詢,沒有顯示commit方法,這也是包裝器的一部分。 有人可以給我展示一個例子嗎?使用promises可以用一個以上的查詢完成整個事務,如果沒有錯誤,然后執行“ commit”?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM