我正在使用bluebird在Node.js中开展基于promise的项目,而在ES6中使用另一个本机承诺项目。在这两个中,我有一个链,我以下列形式查询数据库:
some_function(/*...*/)
.then(function () {
return query("SELECT `whatever` FROM `wherever` ")
})
.then(/*...*/)
请注意,query
显然会返回已解析为查询结果的承诺。
这在几个链中重复,我正在寻找一种方法来清理未使用的函数包装器。
我自然会使用Function.prototype.apply()
,但在这种情况下,当我尝试时:
.then(query.apply(this, ["SELECT * FROM ... "]))
.then(function(rows){ /*...*/ })
链中的下一个函数将rows
作为undefined
。
感谢前方。感谢您的帮助。
答案 0 :(得分:4)
您必须将函数引用传递给.then()
,以便您的选择如下:
.bind()
创建其他功能。内联匿名
some_function(/*...*/).then(function () {
return query.apply("SELECT `whatever` FROM `wherever` ")
}).then(/*...*/)
您自己的函数包装器
function queryWrap(q) {
return function() {
return query.apply(q);
}
}
some_function(/*...*/)
.then(queryWrap("SELECT `whatever` FROM `wherever` "))
.then(/*...*/)
如果你可以在多个地方使用它,这个包装器会很有用。可能不值得一次调用。
使用.bind()
some_function(/*...*/)
.then(query.apply.bind(query, "SELECT `whatever` FROM `wherever` "))
.then(/*...*/)
答案 1 :(得分:4)
在es6中,箭头函数解决了这个问题:
.then(() => query.apply("SELECT `whatever` FROM `wherever` "))
.then(rows => { /*...*/ })