2014-03-04 162 views
5

我認爲我對承諾有一個體面的理解,直到我遇到了一個簡化的代碼段下面的問題。我的印象是,console.log調用會輸出first second third,但取而代之的是second third firstJavascript承諾不會等待解決

有人可以解釋爲什麼第二個和第三個承諾能夠繼續,而不等待第一個承諾。

var Q = require('q'); 

(function() { 

    var Obj = function() { 

    function first() { 
     var deferred = Q.defer(); 

     setTimeout(function() { 
     console.log('in the first') 
     deferred.resolve(); 
     }, 200); 

     return deferred.promise; 
    } 

    function second() { 
     return Q.fcall(function() { 
     console.log('in the second'); 
     }) 
    } 

    function third() { 
     return Q.fcall(function() { 
     console.log('in the third'); 
     }) 
    } 

    return { 
     first: first, 
     second: second, 
     third: third 
    } 
    }; 

    var obj = Obj(); 
    obj.first() 
    .then(obj.second()) 
    .then(obj.third()); 

}()); 

回答

6

你不應該調用該函數,但傳遞給函數,這樣

obj.first() 
    .then(obj.second) 
    .then(obj.third); 

輸出

in the first 
in the second 
in the third 
+0

該訣竅。我之所以調用函數的原因是,在實際的代碼中,我需要將參數傳遞給承諾方法,這些方法在此處被遺漏。它看起來像我將不得不包裝在一個額外的功能。謝謝您的幫助 – chris