首先分析宏任务和微任务的运行机制,并针对日常开发中遇到的各种宏任务&微任务的方法,结合一些例子来看看代码运行的顺序逻辑,把这部分知识点重新归纳和梳理。
在日常开发中,例如 setTimeout和 promise都是经常会使用到的 JS方法。当这些方法变多了之后,再结合 JS的异步编程代码混合使用,最终的执行顺序也经常会让开发者迷惑,因此要把这些问题搞清楚,这部分还是有必要好好学习一下。
在开始前请先思考一下:
- 宏任务和微任务分别有哪些方法?
- 宏任务和微任务互相嵌套,执行顺序是什么样的?
代码执行顺序(一)
开始讲解正式内容之前,我们先看一段代码,算是开胃的前菜,如果之前对这部分知识稍有了解,一般都应该可以回答正确。
console.log("begin");
setTimeout(() => {
console.log('setTimeout');
}, 0);
new Promise((resolve)=>{
console.log('promise');
resolve();
}).then(()=>{
console.log("then1");
}).then(()=>{
console.log("then2");
})
console.log('end');
/*
执行结果:
begin
promise
end
then1
then2
setTimeout
*/
其实这个就涉及了 JavaScript
事件轮询中的宏任务和微任务,如果答对了,说明基本思路是没问题的。那么这里我就直接给出结论,宏任务和微任务的执行顺序基本是,在 EventLoop
中,每一次循环称为一次 tick
,主要的任务顺序如下:
- 执行栈选择最先进入队列的宏任务,执行其同步代码直至结束;
- 检查是否有微任务,如果有则执行直到微任务队列为空;