在chrome和node環境環境中均輸出2, 3, 1, 先輸出2沒什麼好說的,3和1順序讓人有些意外php
緣由:
有一個事件循環,可是任務隊列能夠有多個。
整個script代碼,放在了macrotask queue中,setTimeout也放入macrotask queue。
可是,promise.then放到了另外一個任務隊列microtask queue中。
這兩個任務隊列執行順序以下,取1個macrotask queue中的task,執行之。
而後把全部microtask queue順序執行完,再取macrotask queue中的下一個任務。
代碼開始執行時,全部這些代碼在macrotask queue中,取出來執行之。
後面遇到了setTimeout,又加入到macrotask queue中,
而後,遇到了promise.then,放入到了另外一個隊列microtask queue。
等整個execution context stack執行完後,
下一步該取的是microtask queue中的任務了。
所以promise.then的回調比setTimeout先執行。node
async function a() { await console.log(1) console.log(2) } async function b() { await a(); } b(); console.log(3)
輸出: 1, 3, 2
chrome
async function a() { await console.log(1) console.log(2) } async function b() { await a(); } b(); setTimeont(function(){console.log(3)},0)