This question already has answers here:
Object method with ES6 / Bluebird promises
(2个答案)
4年前关闭。
我发现了一种困难的方法,即不能简单地将对象的函数传递给Bluebird
我知道这都不是异步的,所以请简单介绍一下同步示例,我的用法是异步的。
您实际上可以使用bluebird的
现在,每当调用Promise处理程序(履行处理程序或拒绝处理程序)时,在函数内部,
注1:在这种特定情况下,
注2:如果不同的处理程序需要不同的上下文,则最好编写匿名函数。在这种情况下,
(2个答案)
4年前关闭。
我发现了一种困难的方法,即不能简单地将对象的函数传递给Bluebird
then
。我假设Bluebird的then
正在做一些魔术,并将传入的函数包装在一个匿名函数中。因此,我在该函数上附加了.bind
并成功运行。这是使用bluebird的正确方法吗?还是有更好的方法?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)
我知道这都不是异步的,所以请简单介绍一下同步示例,我的用法是异步的。
最佳答案
是的,这是保留上下文的一种方法。您还可以传递一个匿名函数(您可能已经知道这一点)。
Promise.resolve("cherry")
.then(function (value) {
return chair.build(value);
})
.then(console.log);
您实际上可以使用bluebird的
Promise.bind
方法,如下所示Promise.resolve("cherry")
.bind(chair)
.then(chair.build)
.then(console.log)
现在,每当调用Promise处理程序(履行处理程序或拒绝处理程序)时,在函数内部,
this
将仅引用chair
对象。注1:在这种特定情况下,
console.log
也将this
作为chair
对象,但是它仍然可以正常工作,因为在Node.js中,不仅在原型(prototype)bu上还对对象本身定义了console.log
函数,并将其绑定(bind)到console
对象。相应的代码是here。注2:如果不同的处理程序需要不同的上下文,则最好编写匿名函数。在这种情况下,
Promise.bind
将无济于事。但是,如果选择使用它,则必须为每个处理程序使用不同的上下文,并且代码可能看起来像这样var chair1 = new Chair("red")
var chair2 = new Chair("green")
Promise.resolve("cherry")
.bind(chair1) // Changing the binding to `chair1`
.then(chair1.build)
.tap(console.log)
.bind(chair2) // Changing the binding to `chair2`
.then(chair2.build)
.tap(console.log);