歡迎訪問個人博客看原文...摸我
學習node eventLoop
的童鞋請注意區分噢....本文代碼都只在瀏覽器下進行vue
setTimeOut
、 setInterval
、 setImmediate
、 I/O
、 各類callback
、UI渲染等
主代碼塊
> setImmediate
> MessageChannel
> setTimeOut
/setInterval
process.nextTick
、Promise
、MutationObserver
、async(實質上也是promise)
process.nextTick
> Promise
> MutationOberser
咱們經常吧EventLoop中分爲 內存、執行棧、WebApi、異步回調隊列(包括微任務隊列和宏任務隊列)node
EventLoop
中執行微任務
,會把新的微任務添加到微任務的隊列中。EventLoop
執行完後,立刻把執行棧中的任務都執行完畢。① Javascript
內核加載代碼到執行棧
② 執行棧
依次執行主線程的同步任務
,過程當中若遇調用了異步Api則會添加回調事件到回調隊列
中。且微任務
事件添加到微任務隊列中,宏任務
事件添加到宏任務隊列中去。直到當前執行棧
中代碼執行完畢。
③ 開始執行當前全部微任務隊列
中的微任務回調事件。 (:smirk:注意是全部哦,至關於清空隊列)
④ 取出宏任務隊列
中的第一條(先進先出原則哦)宏任務,放到執行棧
中執行。
⑤ 執行當前執行棧
中的宏任務,若此過程總又再遇到微任務
或者宏任務
,繼續把微任務
和宏任務
進行各自隊伍的入隊
操做,而後本輪的宏任務
執行完後,又把本輪產生的微任務
一次性出隊都執行了。
⑥ 以上操做往復循環...就是咱們平時說的eventLoop
了git
....特色是github
let promiseGlobal = new Promise(resolve=>{
console.log(1)
resolve('2')
})
console.log(3)
promiseGlobal.then(data=>{
console.log(data)
let setTimeoutInner = setTimeout(_=>{
console.log(4)
},1000)
let promiseInner =new Promise(resolve=>{
console.log(5)
resolve(6)
}).then(data=>{
console.log(data)
})
})
let setTimeoutGlobal = setTimeout(_=>{
console.log(7);
let promiseInGlobalTimeout = new Promise(resolve=>{
console.log(8);
resolve(9)
}).then(data=>{
console.log(data)
})
},1000)
複製代碼
建議不要直接拷貝到 控制檯跑...你們先想一想:smirk:編程
1 3 2 5 6 __ 等待一秒___ 7 8 9 4promise
Q: 個人setTimeout
函數到時間了,爲啥一直不去執行。瀏覽器
A: setTimeOut
的回調會被放到任務隊列中,須要當前的執行棧執行完了,纔會去執行執行任務隊列中的內容。出現setTimeout
回調不及時,說明在執行棧中出現了阻塞,或者說執行代碼過多。dom
常見的vue.$nextTick
會把事件直接插入到當前微任務
隊列的中,感興趣的請看個人筆記《vue_nextTick與eventLoop》 傳送門--> 和 《vue_DOM更新與nextTick》傳送門-->異步
歡迎star個人githubasync