2015-04-05 132 views
1

我注意到Firefox的承諾推遲了完整性通知。斷言失敗後,因爲onFullfilled()被調用得太晚*何時調用Promise.then()鉤子?

var resolved = false; 
function onFullfilled() { 
    resolved = true; 
    log("Completed"); 
} 
Promise.resolve(true).then(onFullfilled); 
assert(resolved, "Promise completed promise should call resolution hook immediately."); 

當恰好onFullfilled()保證在承諾的分辨率被稱爲?

*在我的情況下,在測試框架報告斷言失敗後出現「已完成」日誌消息。

回答

3

無極分辨率鉤總是稱爲執行所有同步代碼。這是設計 - 爲了防止競爭條件。

由於承諾有時可以異步解析,因此規範要求它們是總是異步解析,因此執行相同的代碼路徑。諾言守護你against Zalgo

這是specified here

onFulfilled或onRejected不能調用,直到執行上下文棧只包含平臺的代碼。

許多測試框架 - 即摩卡支持測試承諾直接與承諾語法 - 通過返回一個承諾。

it("does something", function(){ 
    return aPromise; // if aPromise resolves the test passes 
}) 
-2

你應該總是給一個函數「then」。所以你應該使用「onFullfilled()」而不是「onFullfilled」作爲「then」的參數。

所以它應該是這樣的:

Promise.resolve(真)。然後(onFullfilled());

+0

不,「.then(onFulfilled)'是正確的。 'onFulfilled'是一個函數。 'onFulfilled()'是一個函數調用。 – 2015-08-20 06:39:43