早年曾写了一篇事件循环的学习笔记,Jake Archibald: In The Loop【事件循环学习笔记】,不过这个以视屏学习为主流程,今天再写一篇,对事件循环做个补充.
一. 为什么需要事件循环
因为js是一门单线程语言,但是我们因为需要调用接口或者进行其他需要延时的操作,如果是单线程,就会阻塞整个进程.所以实现单线程非阻塞的方法就是事件循环.
在JS中任务大致分为两种:
- 同步任务:可以立即执行,同步任务一般会直接进入到主线程中执行.
注意:new Promise
是同步任务,可以进入主线程 - 异步任务:异步进行的任务,例如setTimeout等等
二.宏任务和微任务
异步任务也分为两种:
-
微任务:一个需要异步执行的函数,执行时机是在主函数执行结束之后、当前宏任务结束之前
常见微任务:promise.then,process.nextTick,MutaionObserver -
宏任务:时间粒度比较大,执行的时间间隔是不能精确控制的,对一些高实时性的需求就不太符合
常见宏任务: script(外层同步代码);setTimeout/setIntervel;setImmediate;UI rendering
事件循环,宏任务,微任务的关系在另一篇文章写了,就不再重复
看一个例子:
console.log(1)
setTimeout(()=>{
console.log(2)
}, 0)
new Promise((resolve, reject)=>{
console.log('new Promise'