欢迎访问个人博客看原文...摸我
学习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