例子瀏覽器
執行順序:異步
eg:執行一個耗時 1 秒的 Promise。
即便耗時一秒的 c1 執行完畢,再 enque 的 c2,仍然先於 d 執行了,這很好地解釋了微任務優先的原理。函數
setTimeout(()=>console.log("d"), 0) var r1 = new Promise(function(resolve, reject){ resolve() }); r.then(() => { var begin = Date.now(); // 強制了 1 秒的執行耗時,這樣,咱們能夠確保任務 c2 是在setTimeout d後加入任務隊列 while(Date.now() - begin < 1000); console.log("c1") new Promise(function(resolve, reject){ resolve() }).then(() => console.log("c2")) });
如何分析異步執行的順序:操作系統
eg:
setTimeout 把整個代碼分割成了 2 個宏觀任務,這裏不管是 5 秒仍是 0 秒,都是同樣的。
第一個宏觀任務中,包含了前後同步執行的 console.log(「a」); 和 console.log("b")
setTimeout 後,第二個宏觀任務執行調用了resolve,而後 then 中的代碼異步獲得執行,因此調用了 console.log(「c」),最終輸出的順序纔是a,b,ccode
function sleep(duration) { return new Promise(function(resolve, reject) { console.log("b"); setTimeout(resolve,duration); }) } console.log("a"); sleep(5000).then(()=>console.log("c"));