- 主线程:同步代码
- 微任务:promise的then和catch方法(数据请求)
- 宏任务:计时器、延时器等异步代码
主线程执行完毕 -> 微任务 -> (判断是否还有新的微任务,有的话加入到后面) ->宏任务 -> 微任务 -> (判断是否还有新的微任务,有的话加入到后面)-> 后续一直循环查看是否存在宏任务和微任务
console.log("我是主线程1");
let pm = new Promise(function (resolve, reject) {
setTimeout(function () {
resolve("传入参数到微任务1")
console.log("我是宏任务1");
}, 1000);
});
let pm2 = new Promise(function (resolve, reject) {
setTimeout(function () {
resolve("传入参数到微任务2")
console.log("我是宏任务2");
}, 1000);
});
let pm3 = new Promise(function (resolve, reject) {
console.log("我是主线程4");
resolve("我是微任务3")
});
console.log("我是主线程2");
pm.then(function (data) {
console.log(data);
return pm;
})
pm2.then(function (data) {
console.log(data);
});
pm3.then(function (data) {
console.log(data);
});
console.log("我是主线程3");
可以看到首先执行了4个主线程 -> 在pm3中发现了一个微任务3执行后 -> 微任务清空 -> 开始执行宏任务 -> 执行了第一个延时器(第一个宏任务)后 -> 遇见了此延时器中的微任务1 -> 并执行此微任务,微任务清空 -> 继续向下寻找宏任务 -> 然后遇见第二个宏任务 -> 执行后 -> 遇见在其中的微任务2 -> 清空微任务。执行完毕