2015-04-06 82 views
2

我有一个简单的Javascript(Node)对象,它具有一个函数,用于设置对象的属性并返回承诺。带对象/原型的链式承诺(Q延迟)使用对象/原型

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

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; 
}; 

当以上所述的承诺失败方式如下所示,this.bar是真实的(如预期)。

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

然而,当它被称为一个链中,它是不确定的:

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

我很好奇,想知道是什么导致了这一点。我最好的猜测是关于我的对象方法链接在一起的方式的封闭问题。

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

任何清晰度将不胜感激!

+0

尝试'foo.set(解决问题),然后(foo.check .bind(foo));' –

+0

啊,是的,这是有效的。非常感谢! – JKE

+0

我将它添加为答案:-)没问题,欢迎您 –

回答

3

你没有上下文调用回调this只是全局对象

当你需要绑定的上下文这样

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