【发布时间】:2015-04-05 20:05:20
【问题描述】:
我有点挣扎。我想在节点中的数据库驱动程序模块上构建一个抽象层。我已经通过执行以下操作来承诺驱动程序模块:
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),以便我的查询函数也被承诺并返回承诺或 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 方法,它也是包装器的一部分。有人可以给我看一个例子吗?使用承诺来完成一个具有多个查询的整个事务,然后如果没有错误则“提交”?
更新 2:
idbehold 下面的示例不允许我做这种事情,假设我们此时不关心交易,只是一个简单的查询:
myDbWrapper.query(queryString, undefined)
.then(function(recordSet) {
console.log(recordSet);
})
.catch(function(err) {
console.error(err);
});
我怎样才能让我的查询方法以这种方式工作?
更新 3:
我找到了答案。见下文。
【问题讨论】:
-
你不需要“承诺”,你只需要
return你已经在使用的承诺。 -
正如 bergi 所说 - 承诺通过返回值起作用 - 如果你希望你的函数被“承诺”,只需从中返回一个承诺 - 这就是它所需要的。
-
您的
getData仍然不是return正在执行 myDbWrapper.startTransaction -
getData 只是一个用于测试的函数。我的示例与 getData 无关。我想知道如何构造包装器调用,例如query、startTransaction 以及在进行基于 promise 的事务时如何使用它们。
标签: javascript promise bluebird