在講 Event Loop (事件循環)以前,咱們來了解點 node 的東西,來幫助咱們更加明白事件循環是幹什麼的vue
Node.js 是一個基於 Chrome V8 引擎的 JavaScript 運行環境,Node 不是一門語言,是讓 js 運行在後端的,運行時不包括 js 全集,由於在服務端中不包含 DOM 和 BOM,Node 也提供了一些新的模塊,好比 http,fs等模塊。java
Node 的首要目標是提供一種簡單的,用於建立高性能服務器的開發工具 Web 服務器的瓶頸在於併發的用戶量,對比 Java 和 Php 的實現方式node
Web 主要場景就是接收客戶端的請求讀取靜態資源和渲染界面,因此 Node 很是適合 Web 應用的開發。web
進程是操做系統分配資源和調度任務的基本單位,線程是創建在進程上的一次程序運行單位,一個進程上能夠有多個線程。ajax
單線程特色是節約了內存,而且不須要在切換執行上下文。並且單線程不須要管鎖的問題,所謂 鎖,在 java 裏纔有鎖的概念,因此咱們不用細研究數據庫
整個的這種運行機制又稱爲 Event Loop (事件循環)後端
如圖(圖片是借鑑的):promise
同步代碼先執行,執行是在棧中執行的,微任務大於宏任務,微任務會先執行(棧),宏任務後執行(隊列)瀏覽器
講到這裏,敲幾行代碼來總結下咱們上面講到的知識點把bash
《1》宏任務,微任務在瀏覽器和 node 環境執行順序不一樣
// 這個列子裏面,包含了宏任務,微任務,分別看看瀏覽器和node 打印的結果
console.log(1)
// 棧
setTimeout(function(){
console.log(2)
// 微任務
Promise.resolve(100).then(function(){
console.log('promise')
})
})
// 棧
let promise = new Promise(function(resolve, reject){
console.log(7)
resolve(100)
}).then(function(data){
// 微任務
console.log(data)
})
// 棧
setTimeout(function(){
console.log(3)
})
console.log(5)
// 瀏覽器結果:1 7 5 100 2 promise 3
// node 結果: 1 7 5 100 2 3 promise
複製代碼
瀏覽器和 node 環境執行順序不一樣,瀏覽器是先把一個棧以及棧中的微任務走完,纔會走下一個棧。node 環境裏面是把因此棧走完,才走微任務
《2》setTimeout setImmediate 都是宏任務,誰優先執行呢?
setTimeout(function(){
console.log('timeout')
})
setImmediate(function(){
console.log('setImmediate')
})
// 結果打印:timeout setImmediate
複製代碼
setTimeout setImmediate 這兩個取決於 node 的執行時間
《3》nextTick 和 then 都屬於微任務,誰優先執行呢?
process.nextTick(function(){
console.log('nextTick')
})
Promise.resolve().then(function(){
console.log('then')
})
// 結果打印:nextTick then
// 再加一個宏任務呢
setImmediate(function(){
console.log('setImmediate')
})
// 結果打印:nextTick then setImmediate
複製代碼
nextTick 會比 其餘微任務、宏任務執行快
《4》i/o 文件操做(宏任務),搭配微任務,誰優先執行呢?
let fs = require('fs');
fs.readFile('./1/log',function(){
console.log('fs')
})
process.nextTick(function(){
console.log('text')
})
// 結果打印:text fs
複製代碼
i/o 文件操做(宏任務), 若是有微任務,先執行微任務,在執行文件讀取