如何通过Bluebird承诺您自己的javascript api,该api使用另一个承诺的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);
});
});
}
如何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);
}
相关文章:
- 一个承诺换多个承诺-并发问题
- 如何用HTML5地理定位API实现承诺
- WinJS,从可能是异步的函数返回一个承诺,也可能不是异步的
- 在jQuery中,.state()如何确定一个承诺是挂起的、已解决的还是被拒绝的
- 转换嵌套'对于'循环成一个承诺,为了一个承诺?嵌套承诺
- 如何通过Bluebird承诺您自己的javascript api,该api使用另一个承诺的api
- jasmine 2.0测试angularjs的工厂方法,这是一个承诺
- 做一些 ajax 并使用 getJSON 返回一个承诺
- 在 AngularJS 中声明一个承诺,并带有命名的成功/错误回调
- 链承诺.all 与从上一个承诺返回的数组.all.
- 如何更好地停止一个承诺链并开始另一个承诺链
- 同时循环承诺,直到另一个承诺结束
- 在angular.extend()中向变量返回一个承诺的值
- 茉莉花单元测试模拟一个承诺
- 我能不能早点结束一个承诺
- 如何使用 Parse.promise javascript 定义一个承诺数组并获取结果数组 [parse.com]
- 茉莉花测试一个承诺,然后功能
- 我可以创建一个承诺来检查变量是否设置为角度吗?
- 在 then() 中断开 for 循环 在一个承诺
- 为什么从JavaScript取回API的响应对象是一个承诺?