将对象绑定到Promise.then()参数的正确方法

时间:2015-06-23 21:15:51

标签: javascript node.js promise this bluebird

我发现了一个简单的方法,即只需将对象的功能传入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)

我知道这些都不是异步的,所以请使用同步示例,我的用法是异步。

1 个答案:

答案 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