[英]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.