函数应用于承诺

Function apply with Promises

本文关键字:承诺 应用于 函数      更新时间:2023-09-26

我正在使用bluebird在Node.js中做一个基于承诺的项目,另一个是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){ /*...*/ })

链中的下一个函数得到rowsundefined

提前谢谢你。谢谢你的帮助。

你必须传递一个函数引用到.then(),所以你的选择如下:

  1. 使用内联匿名函数。
  2. 创建自己的实用程序函数,返回另一个函数(参见下面的示例)
  3. 使用.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 => { /*...*/ })