大話前端之NodeJS中的Event Loop
大話不廢話,前端不限端,大話前端獨到見解,和您一起思考前端的方方面面
之前面試的時候,被問過一段代碼的執行順序,其實就是考察Event Loop,因為當時對這個理解不是很深刻,所以回答的不好,今天來說一下這個技術點
下面會有三段代碼,我會在錄音里去解釋一下為什麼會有這樣的結果
Node: v7.9.0
- 第一段代碼
setImmediate(function(){n console.log(1);n},0);nsetTimeout(function(){n console.log(2);n},0);nnew Promise(function(resolve){n console.log(3);n resolve();n console.log(4);n}).then(function(){n console.log(5);n});nconsole.log(6);nprocess.nextTick(function(){n console.log(7);n});nconsole.log(8);n
結果:
3n4n6n8n7n5n2n1n
2. 第二段代碼
console.log(script start);nnsetTimeout(function() {n console.log(setTimeout);n}, 0);nnPromise.resolve().then(function(resolve) {n console.log(promise1);n setTimeout(function() {n console.log(setTimeout in microtask);n }, 0);n}).then(function() {n console.log(promise2);n});nnconsole.log(script end);n
結果:
script startnscript endnpromise1npromise2nsetTimeoutnsetTimeout in microtaskn
3. 第三段代碼
process.nextTick(function () {n console.log(nextTick 延遲執行1);n});nnprocess.nextTick(function () {n console.log(nextTick 延遲執行2);n});nnsetImmediate(function () {n console.log(setImmediate延遲執行1)n process.nextTick(function () {n console.log(強勢插入);n })n})nnsetImmediate(function () {n console.log(setImmediate延遲執行2)n})nnsetTimeout(function () {n console.log(timeout...);n},0)nnconsole.log(正常執行)n
結果:
正常執行nnextTick 延遲執行1nnextTick 延遲執行2ntimeout...nsetImmediate延遲執行1nsetImmediate延遲執行2n強勢插入n
4. 第四段代碼
const fs = require(fs);nnfs.readFile(__filename, () => {n setTimeout(() => {n console.log(timeout);n }, 0);n setImmediate(() => {n console.log(immediate);n });n});n
結果:
你猜猜?
大話前端之NodeJS中的Event Loop
推薦閱讀:
※前端必備技能——切圖:進階篇
※「雲途乾貨」大話前端自動化構建之壹看板也曾「年幼」
※上傳頭像
※[live預告] 聊聊前端培訓那些事