什么是事件循环?
在JS中我们经常会需要“同时”进行多项工作,例如:定时器、事件、异步数据交互等,那么JS是如何管理这些任务的,又是如何确定他们的执行顺序的?
首先,所有的语言都拥有并发模型的概念,也就是说多个任务如何同时执行,大部分语言支持多线程执行,JS拥有所有语言中最简单的并发模型——JS使用单线程的"事件循环(Event Loop)"来处理多个任务的执行
简单来说,js的事件循环,每次读取一个任务,然后执行这个任务,执行完再继续获取下一个,如果暂时没有任务,就暂停执行,等待下一个任务到来;如果在执行任务的过程中有新的任务到达,也不会中断现有任务的执行,而是添加到队列的尾部等待
宏任务 微任务
- 宏任务(macroTask或简称Task):普通的任务,正常执行
- 微任务(microTask):优先于宏任务执行(但依然是非抢断的)
-
宏任务:正常的异步任务都是宏任务,最常见的就是定时器(setInterval, setImmediate, setTimeout)、IO任务
-
微任务:微任务出现比较晚,queueMicrotask、Promise和async属于微任务
console.log('aaa'); 正常第一个输出
setTimeout(()=>console.log('t1'), 0); 宏任务 丢到队列里 第七个执行
(async ()=>{
console.log(111); 异步,第二个输出
await console.log(222); 第三个输出
console.log(333); 收到了等待 所以丢到队列里 又因为是微任务 所以在上面的定时器之前 第五个执行
setTimeout(()=>console.log('t2'), 0);丢到队列里 最后一个执行
})().then(()=>{
console.log(444); 回调 所以丢到队列里 第六个执行
});
console.log('bbb'); 第四个执行
aaa
111
222
bbb
333
444
t1
t2
简单来说就是按顺序执行,宏任务丢到最后执行 微任务按顺序执行
输出结果