函数适用于Promises

我正在使用蓝鸟在Node.js中开发一个基于承诺的项目,而另一个项目则是由ES6提供的本地承诺。 在这两个中,我有一个链,我在以下forms查询数据库:

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

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

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

 .then(query.apply(this, ["SELECT * FROM ... "])) .then(function(rows){ /*...*/ }) 

链中的下一个函数将rows undefinedundefined

谢谢你。 你的帮助表示赞赏。

您必须将函数引用传递给.then()以便您的select如下所示:

  1. 像你一样使用内联匿名函数。
  2. 创build你自己的效用函数,返回另一个函数(参见下面的例子)
  3. 使用.bind()来创build另一个函数。

内联匿名

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