我正在为此苦苦挣扎。我想在节点中的数据库驱动模块上构建一个抽象层。如何promisify你自己的JavaScript API使用另一个promisified API与蓝鸟?
var sql = Promise.promisifyAll(require('sql-driver'));
然后我自己的js文件中我想换行查询,像这样:我已经通过执行以下操作promisified驱动模块
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(使用蓝鸟),所以我的查询函数也是promisified并返回一个承诺或可以吗?
更新:
我想也可以promisified我的包装方法,使用户能够做这样的事情:
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:
我发现我的答案。见下文。
你不需要“promisify”,你只需要“返回”你已经使用的承诺。 – Bergi 2015-02-05 20:12:00
正如bergi所说 - 承诺通过返回值工作 - 如果你希望你的函数被“promisified”只是简单的回复一个承诺 - 这就是所需要的。 – 2015-02-05 20:18:33
您的'getData'仍然不是'return' myDbWrapper.startTransaction – 2015-02-05 20:53:12