事件循环
终极事件循环
将下面👇的问题搞清楚基本事件循环就过关了
console.log('script start');
async function async1() {
await async2();
console.log('async1')
}
async function async2() {
console.log('async2')
}
setTimeout(() => {
console.log('setTimeout')
},0)
new Promise(resolve => {
console.log('promise');
resolve();
}).then(() => {
console.log('promise1')
}).then(() => {
console.log('promise2')
})
Promise.resolve().then(() => {
console.log('promise resolve');
})
async1();
console.log('script end');
// 输出顺序如下:
// script start
// promise
// async2
// script end
// promise1
// promise resolve
// async1
// promise2
// settimeout
// 解析版:
console.log('script start'); // 【第一个输出】
async function async1() {
await async2();
console.log('async1') // 又一个then 放入微任务 3 【第七个输出】
}
async function async2() {
console.log('async2') // 【第三个输出】
}
setTimeout(() => {
console.log('setTimeout') // 宏任务队列,微任务全部结束最后输出 【第九个输出】
},0)
new Promise(resolve => {
console.log('promise'); // 【第二个输出】
resolve(); // then 放入微任务 1
}).then(() => {
console.log('promise1') // 【第五个输出】
}).then(() => {
console.log('promise2') // 又遇到一个then 加入微任务 4 【第八个输出】
})
Promise.resolve().then(() => { // 又一个then 放入微任务 2
console.log('promise resolve'); // 【第六个输出】
})
async1();
console.log('script end'); // 【第四个输出】,之后开始执行微任务队列
tip
在做事件循环问题的时候,在纸上画一画,画出主调用栈、微任务队列、宏任务队列,帮助理清思路