一、Event Loop概念:
Event Loop即事件循环,是指浏览器或Node的一种解决javaScript单线程运行时不会阻塞的一种机制,也就是我们经常使用异步的原理。
二、Event Loop:
同步任务和异步任务
为了防止某个耗时任务导致程序假死的问题,javaScript把待执行的任务分为了两类:
-
1.同步任务(syncchronous)
又叫非耗时任务,指的是主线程上排队执行的那些任务
只有前一个任务执行完毕,才能执行后一个任务 -
2.异步任务(asyncchronous)
又叫做耗时任务,异步任务由javaScript委托给宿主环境进行执行
当异步任务执行完成后,会通知javaScript主线程执行异步任务的回调函数
三、同步任务与异步任务的执行过程:
1.同步任务由JavaScript 主线程次序执行
2.异步任务委托给宿主环境执行
3.已完成的异步任务对应的回调函数,会被
加入到任务队列中等待执行
4.avaScript 主线程的执行栈被清空后,会
读取任务队列中的回调函数,次序执行
5.JavaScript 主线程不断重复上面的第 4 步
宏任务和微任务:
宏任务和微任务的根本区别:
1.常见的宏任务有:setTimeout setInterval ajax DOM事件
2.常见的微任务有:promise async/await
3.微任务的执行时间早于宏任务
4.微任务是由es6语法规定的,宏任务是浏览器规定的
宏任务与微任务的执行顺序:
每一个宏任务执行完毕后,都会检查是否还存爱待执行的微任务,如果有,则执行完所有的微任务之后,再继续执行下一个宏任务
经典案例:
console.log('start');
setTimeout(() => {
console.log(1);
});
Promise.resolve('x').then(() => {
console.log(2);
}).then(() => {
console.log(3);
}).then(() => {
console.log(4);
})
console.log('end');
输入结果:start–>end–>2—>3–>4–>1
分析:
1.start和end属于同步代码优先执行
2.promise里的代码也属于同步代码,但.then里的代码属于异步代码中的微任务,稍后执行
3.setTimeout属于异步代码中的宏任务,最后执行