函数应用于承诺
Function apply with Promises
我正在使用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){ /*...*/ })
链中的下一个函数得到rows
为undefined
。
提前谢谢你。谢谢你的帮助。
你必须传递一个函数引用到.then()
,所以你的选择如下:
- 使用内联匿名函数。
- 创建自己的实用程序函数,返回另一个函数(参见下面的示例)
- 使用
.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 => { /*...*/ })
相关文章:
- 将函数的上下文应用于javascript变量
- 将CSS应用于printWindow.print();在Javascript中
- 如何将CSS(特别是填充/边距)应用于select下拉菜单的选项或optgroup
- $scope.apply()何时应用于angular
- Javascript非常简单:'阅读更多''显示较少'应用于Wordpress的功能
- 尝试应用于<tr>在ng单击中
- 如何将javascript仅应用于1个表单中的2个表单提交按钮中的1个
- 将脚本应用于Angular 2上的输入
- Json和$scope的角度之间的差异$eval应用于JSON字符串时
- 如何将参数应用于String.prototype.format函数
- 动态地将过滤器应用于 JSON.parse()
- $location更改不适用于ngchange,而是应用于ngclick
- 如何将 :empty 选择器应用于 XML 文档
- 如何仅在文本字段中有值时才将自定义过滤器应用于 ng-repeat
- 如何使用 JavaScript 将样式应用于 CKEditor 中的选定文本
- MongoDB 无法将$addToSet应用于 Meteor JS 中的非数组
- 将类应用于jquery ui对话框
- 将CSS应用于在JavaScript中创建的表-表的位置不正确
- 如果检查了输入,则将类应用于<身体>,没有jQuery
- 将数据表.js样式应用于 AJAX 加载的表