const promise = new Promise((resolve, reject) => { console.log(1); resolve(); console.log(2); }) promise.then(() => { console.log(3); }) console.log(4);
以上輸出結果為1243
首先Promise新建后立即執行,所以會先輸出1,2,而Promise.then()內部的代碼在當次事件循環的結尾立即執行,所以會先輸出4,最后輸出3.
事件循環里面有宏任務和微任務:
宏任務有setTimeout、setInterval、 setImmediate、script(整體代碼)、 I/O 操作等
微任務有process.nextTick、new Promise().then(回調)
Node與瀏覽器的 Event Loop 差異:
node11及之后與瀏覽器保持一致,先執行一個宏任務,宏任務執行完把當前的微任務清空
node10及之前允許多個宏任務先執行,然后再按順序清空宏任務對應的微任務隊列
setTimeout(()=>{ console.log('timer1') Promise.resolve().then(function() { console.log('promise1') }) }, 0) setTimeout(()=>{ console.log('timer2') Promise.resolve().then(function() { console.log('promise2') }) }, 0)
在瀏覽器中執行輸出:timer1 promise1 timer2 promise2
node10執行輸出:timer1 timer2 promise1 promise2
node11執行輸出:timer1 promise1 timer2 promise2與瀏覽器保持一致