将对象绑定到 Promise.then() 参数的正确方法 [重复]
Posted
技术标签:
【中文标题】将对象绑定到 Promise.then() 参数的正确方法 [重复]【英文标题】:The correct way to bind object to Promise.then() argument [duplicate] 【发布时间】:2015-09-09 21:29:05 【问题描述】:我发现很难将对象的函数简单地传递给 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)
我知道这些都不是异步的,所以请以同步示例为例,我的用法是异步的。
【问题讨论】:
没听说过 Bluebird,但是如果它的 Promise 遵循 jQuery 实现的 Promise 模式,那么只要你的目标是支持Function.bind
的现代浏览器,这就是可行的方法(否则你需要自己滚动,或者使用下划线作为bind
shim)
当然。如果@thefourtheye 是对的,并且这个Promise
有它自己的bind
功能,我可能会改用它。
@Lambat 它是蓝鸟特有的功能:-)
【参考方案1】:
所以我在函数上附加了一个
.bind
,它起作用了。这是对蓝鸟执行此操作的正确方法吗?
是的,这是保留上下文的一种方式。你也可以传递一个匿名函数(你可能已经知道了)。
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 中,@987654332 @函数不仅在原型上定义,也在对象本身上定义,绑定到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);
【讨论】:
以上是关于将对象绑定到 Promise.then() 参数的正确方法 [重复]的主要内容,如果未能解决你的问题,请参考以下文章