将对象绑定到 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() 参数的正确方法 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

.then()方法的意思和用法

09 promise then

promise.all 怎么用

Promise

使用类方法作为回调时的 Promise.then 执行上下文

RxJS 序列等价于 promise.then()?