函数适用于Promises

时间:2015-08-16 17:29:23

标签: javascript node.js bluebird es6-promise

我正在使用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

感谢前方。感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

您必须将函数引用传递给.then(),以便您的选择如下:

  1. 使用内联匿名函数。
  2. 创建自己的实用程序函数,返回另一个函数(参见下面的示例)
  3. 使用.bind()创建其他功能。
  4. 内联匿名

    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 => { /*...*/ })