之前寫了篇文章 JS運行機制,裡面對event loop簡單的說明,面試時又遇到了關於該知識點的題目(主要是process.nextTick和setImmediate的執行順序不太知道,查了之後才知道是關於Node JS的event loop)看了阮一峰老師的博客,又有了更深入的理解: JS中的任務 ...
之前寫了篇文章 JS運行機制,裡面對event loop簡單的說明,面試時又遇到了關於該知識點的題目(主要是process.nextTick和setImmediate的執行順序不太知道,查了之後才知道是關於Node JS的event loop)看了阮一峰老師的博客,又有了更深入的理解:
JS中的任務分同步任務和非同步任務:
所有同步任務都在主線程中執行,形成一個執行棧;
主線程之外還有一個任務隊列,用於存放非同步任務,執行棧中的同步任務執行完畢,系統就會讀取任務隊列中的非同步任務,將其放到執行棧中;
上述過程不斷迴圈,此過程就是Event Loop
NodeJS的Event Loop
Node.js也是單線程的Event Loop,但是它的運行機制不同於瀏覽器環境.
除了setTimeout和setInterval這兩個方法,Node.js還提供了另外兩個與"任務隊列"有關的方法:process.nextTick和setImmediate。
process.nextTick方法可以在當前"執行棧"的尾部----下一次Event Loop(主線程讀取"任務隊列")之前----觸發回調函數。
setImmediate方法則是在當前"任務隊列"的尾部添加事件。(摘自阮老師的博客)
概括來說,執行順序:process.nextTick > setTimeout(setInterval) > setImmediate
process.nextTick(()=>{ console.log('nextTick'); }) Promise.resolve().then(()=>{console.log('promise1')}).then(()=>{ console.log('promise2'); }); setImmediate(()=>{console.log('setImmediate1')}) console.log('end'); 執行結果: end nextTick promise1 promise2 setImmediate1 //說明:先執行同步任務--輸出end,process.nextTick會在執行棧尾部觸發,所以接下來會輸出nextTick //setImmediate會在任務隊列的尾部,因此順序是promise1 promise2 setImmediate1
NodeJS event loop參考 https://blog.csdn.net/hkh_1012/article/details/53453138
參考;阮一峰老師博客http://www.ruanyifeng.com/blog/2014/10/event-loop.html