功能适用于Promises

Sel*_*ish 5 javascript node.js bluebird es6-promise

我正在使用bluebird在Node.js中开展基于promise的项目,而在ES6中使用另一个本机承诺.在这两个中,我有一个链,我以下面的形式查询数据库:

some_function(/*...*/)

    .then(function () {
        return query("SELECT `whatever` FROM `wherever` ")
    })

    .then(/*...*/)
Run Code Online (Sandbox Code Playgroud)

请注意,query显然会返回一个解析为查询结果的promise.这在几个链中重复,我正在寻找一种方法来清理未使用的函数包装器.

我自然会使用Function.prototype.apply(),但在这种情况下,当我尝试:

.then(query.apply(this, ["SELECT * FROM ... "]))
.then(function(rows){ /*...*/ })
Run Code Online (Sandbox Code Playgroud)

在链中的下一个函数得到rowsundefined.

谢谢你的提前.非常感谢您的帮助.

jfr*_*d00 4

您必须传递一个函数引用,.then()因此您的选择如下:

  1. 按原样使用内联匿名函数。
  2. 创建您自己的实用程序函数,该函数返回另一个函数(请参见下面的示例)
  3. 用于.bind()创建另一个函数。

内联匿名

some_function(/*...*/).then(function () {
    return query.apply("SELECT `whatever` FROM `wherever` ")
}).then(/*...*/)
Run Code Online (Sandbox Code Playgroud)

您自己的函数包装器

function queryWrap(q) {
    return function() {
        return query.apply(q);
    }
}

some_function(/*...*/)
  .then(queryWrap("SELECT `whatever` FROM `wherever` "))
  .then(/*...*/)
Run Code Online (Sandbox Code Playgroud)

如果您可以在多个地方使用它,那么这个包装器可能会很有用。仅仅一次调用可能不值得。

使用.bind()

some_function(/*...*/)
  .then(query.apply.bind(query, "SELECT `whatever` FROM `wherever` "))
  .then(/*...*/)
Run Code Online (Sandbox Code Playgroud)