2015-04-06 81 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));