2016-01-10 85 views
0

我有類似於下面的代碼。它應該打印出「in intermediate then」和after then「in final then」,但它首先打印「in final then」(即在調用deferred.resolve()之前調用then函數)。任何想法,爲什麼會發生這種情況?它是否與$超時有關?angularjs承諾:然後在超時之前調用deferred.resolve()

var promise = myFunctionThatReturnsAPromise(); 
promise.then(function() { 
    console.log('in final then!'); 
}); 

var myFunctionThatReturnsAPromise = function() { 
    var deferred = $q.defer(); 
    $timeout(function() { 
     console.log('in intermediate then'); 
     deferred.resolve(); 
    }, 0); 
    return deferred.$promise; 
}; 
+0

如果您更改超時時間長度,是否仍然發生?我認爲這與角度刷新超時隊列以及在相同刻度中的承諾隊列有關。 –

+0

或者,我相信setTimeout獨立於摘要循環運行,所以對於您所尋找的內容可能更可靠。 –

+0

應該是'return deferred.promise'。此外,在這種特殊情況下,您不需要另一個承諾 - 只需返回'$ timeout'生成的承諾 - 'return $ timeout(function(){...}) –

回答

2

我敢肯定,你應該返回deferred.promise,沒有$

這裏是plunker