首先經過一段代碼進入討論的主題html
var r = new Promise(function(resolve, reject){ console.log("a"); resolve() }); setTimeout(()=>console.log("d"), 0) r.then(() => console.log("c")); console.log("b") // a b c d
瞭解過 Promise 對象的都知道(若是還不瞭解,能夠查看 Promise對象),Promise 新建後會當即執行,因此首先會輸出a,這個沒有問題。setTimeout 和 then 這兩個回調函數會在本輪事件循環結束之後執行,因此第二個輸出的是b,這個也沒有問題,可是回過頭來執行 setTimeout 和 then 方法時,setTimeout 的執行順序明明先於 then 方法且延遲時間爲0毫秒,爲何卻後執行呢?是由於HTML5標準中規定setTimeout最小延遲時間不足4毫秒的仍然取值爲4毫秒嗎?顯然不是,此處,就算把延遲時間從0改成4000毫秒,依然滯後於then 方法輸出。接下來進入正題前端
提示:阮一峯老師的文章 《JavaScript 運行機制詳解:再談Event Loop》 是解開本次探討答案的關鍵,建議仔細閱讀瀏覽器
1、爲何Javascript是單線程?數據結構
console.log(1); setTimeout(function(){console.log(2);},1000); console.log(3); // 1 3 2
console.log(1); setTimeout(function(){console.log(2);}, 0); console.log(3); // 1 3 2
6、宏觀任務(MacroTask)和 微觀任務(MicroTask)異步
var r = new Promise(function(resolve, reject){ console.log("a"); resolve() }); setTimeout(()=>console.log("d"), 0) r.then(() => console.log("c")); console.log("b")
Promise.resolve().then(()=>{ console.log('1') setTimeout(()=>{ console.log('2') },0) }) setTimeout(()=>{ console.log('3') Promise.resolve().then(()=>{ console.log('4') }) },0)
Promise.resolve().then(()=>{ console.log('1') setTimeout(()=>{ console.log('2') },0) }) setTimeout(()=>{ console.log('3') Promise.resolve().then(()=>{ console.log('4') }) }, 3000) // 1 2 3 4
setTimeout(function(){console.log(4)},0); new Promise(function(resolve){ console.log(1) for( var i=0 ; i<10000 ; i++ ){ i==9999 && resolve() } console.log(2) }).then(function(){ console.log(5) }); console.log(3); // 1 2 3 5 4
setTimeout(function(){console.log(4)},0); new Promise(function(resolve){ console.log(1) for( var i=0 ; i<10000 ; i++ ){ // i==9999 && resolve() } console.log(2) }).then(function(){ console.log(5) }); console.log(3); // 1 2 3 4