函数适用于 Promises
Function apply with Promises
我正在 Node.js 中使用 bluebird 开发一个基于 promise 的项目,另一个使用 ES6 的原生 promise。在这两种情况下,我都有一个链,我在其中以以下形式查询数据库:
some_function(/*...*/)
.then(function () {
return query("SELECT `whatever` FROM `wherever` ")
})
.then(/*...*/)
请注意,query
显然 returns 承诺解决了查询结果。
这在几个链中重复,我正在寻找一种方法来清理未使用的函数包装器。
我自然会使用 Function.prototype.apply()
,但在这种情况下,当我尝试时:
.then(query.apply(this, ["SELECT * FROM ... "]))
.then(function(rows){ /*...*/ })
链中的下一个函数得到 rows
作为 undefined
。
提前致谢。感谢您的帮助。
您必须将函数引用传递给 .then()
,因此您的选择如下:
- 照原样使用内联匿名函数。
- 创建您自己的效用函数 returns 另一个函数(参见下面的示例)
- 使用
.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(/*...*/)
在 es6 中,箭头函数最好地解决了这个问题:
.then(() => query.apply("SELECT `whatever` FROM `wherever` "))
.then(rows => { /*...*/ })
我正在 Node.js 中使用 bluebird 开发一个基于 promise 的项目,另一个使用 ES6 的原生 promise。在这两种情况下,我都有一个链,我在其中以以下形式查询数据库:
some_function(/*...*/)
.then(function () {
return query("SELECT `whatever` FROM `wherever` ")
})
.then(/*...*/)
请注意,query
显然 returns 承诺解决了查询结果。
这在几个链中重复,我正在寻找一种方法来清理未使用的函数包装器。
我自然会使用 Function.prototype.apply()
,但在这种情况下,当我尝试时:
.then(query.apply(this, ["SELECT * FROM ... "]))
.then(function(rows){ /*...*/ })
链中的下一个函数得到 rows
作为 undefined
。
提前致谢。感谢您的帮助。
您必须将函数引用传递给 .then()
,因此您的选择如下:
- 照原样使用内联匿名函数。
- 创建您自己的效用函数 returns 另一个函数(参见下面的示例)
- 使用
.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(/*...*/)
在 es6 中,箭头函数最好地解决了这个问题:
.then(() => query.apply("SELECT `whatever` FROM `wherever` "))
.then(rows => { /*...*/ })