大話前端之NodeJS中的Event Loop

大話不廢話,前端不限端,大話前端獨到見解,和您一起思考前端的方方面面

之前面試的時候,被問過一段代碼的執行順序,其實就是考察Event Loop,因為當時對這個理解不是很深刻,所以回答的不好,今天來說一下這個技術點

下面會有三段代碼,我會在錄音里去解釋一下為什麼會有這樣的結果

Node: v7.9.0

  1. 第一段代碼

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預告] 聊聊前端培訓那些事

TAG:前端开发 | 前端工程师 |