使用Object / Prototype链接的Promises(Q deferred)

时间:2015-04-06 20:50:33

标签: javascript closures prototype promise

我有一个简单的Javascript(Node)对象,它有一个在对象上设置属性并返回promise的函数。

请注意,对于此示例,我已删除了需要延迟的实际异步调用,因为它不会影响结果。

var q = require("Q");

var Foo = function(){
  this.bar = false;
  return this;
};

Foo.prototype.set = function(){
  var d = q.defer();
  this.bar = true; 
  d.resolve();
  return d.promise;
};

Foo.prototype.check = function(){
  var d = q.defer();
  console.log(this.bar);
  d.resolve();
  return d.promise;
};

如果以下面的承诺失败方式调用上述内容,则此.bar为真(如预期的那样)。

var foo = new Foo();
foo.set().then(function(){
  foo.check();
});

然而,当它在链中被调用时,它是未定义的:

foo.set().then(foo.check);

我很想知道造成这种情况的原因。我最好的猜测是关闭问题,我的对象的方法被链接在一起。

在大多数情况下,我会传递值来解决/拒绝并从那里开始。在这种情况下,我想通过一系列顺序函数运行一些数据(一些需要延期)。我想要存储和更新对象本身的数据,而不是将输出传递给链中的每个函数。

任何清晰度都将非常感谢!

1 个答案:

答案 0 :(得分:3)

您在没有上下文的情况下调用回调的问题和this只是全局对象

作为一种解决方案,您需要像这样绑定上下文

foo.set().then(foo.check.bind(foo));