我发现了一个简单的方法,即只需将对象的功能传入Bluebird then
即可。我假设Bluebird的then
正在做一些魔术并在匿名函数中包装传入的函数。所以我将.bind
附加到函数中并且它有效。这是用蓝鸟做这个的正确方法吗?还是有更好的方法吗?
var Promise = require("bluebird")
var Chair = function(){
this.color = "red"
return this
}
Chair.prototype.build = function(wood){
return this.color + " " + wood
}
var chair = new Chair()
//var x = chair.build("cherry")
Promise.resolve("cherry")
.then(chair.build.bind(chair)) // color is undefined without bind
.then(console.log)
我知道这些都不是异步的,所以请使用同步示例,我的用法是异步。
答案 0 :(得分:24)
所以我将
[{ ID: 2, 'CreatedYM': '2014-May'}, { ID: 5, 'CreatedYM': '2014-Dec'}, { ID: 3, 'CreatedYM': '2015-Jan'}, { ID: 1, 'CreatedYM': '2015-Jun'}, { ID: 4, 'CreatedYM': '2015-Aug'},]
附加到函数中并且它有效。这是用bluebird做到这一点的正确方法吗?
是的,这是保留上下文的一种方法。您也可以传递一个匿名函数(您可能已经知道了这一点)。
.bind
或者有更好的方法吗?
您实际上可以使用bluebird的Promise.bind
方法,就像这样
Promise.resolve("cherry")
.then(function (value) {
return chair.build(value);
})
.then(console.log);
现在,只要调用Promise处理程序(履行处理程序或拒绝处理程序),在函数内部Promise.resolve("cherry")
.bind(chair)
.then(chair.build)
.then(console.log)
将只引用this
对象。
注意1:在这种特定情况下,chair
也会将console.log
作为this
对象,但它仍能正常工作,因为, Node.js,chair
函数不仅定义在对象本身的原型bu上,还绑定到console.log
对象。相应的代码为here。
注2:如果不同的处理程序需要不同的上下文,那么最好编写匿名函数。在这种情况下,console
将无济于事。但是如果你选择使用它,那么你必须为每个处理程序使用不同的上下文,你的代码可能看起来像这样
Promise.bind