2. 运行优先级
JavaScript 的事件循环(Event Loop)按照以下顺序执行任务:
- 同步任务:优先执行。
- 微任务:在同步任务之后、下一个宏任务之前执行。
- 宏任务:在微任务之后执行。
3. 示例代码
以下代码展示了同步任务、微任务、宏任务和 async/await 的执行顺序:
console.log('1. 同步任务开始');
setTimeout(() => {
console.log('6. 宏任务(setTimeout)');
}, 0);
Promise.resolve()
.then(() => {
console.log('3. 微任务(Promise.then 1)');
})
.then(() => {
console.log('4. 微任务(Promise.then 2)');
});
async function asyncFunc() {
console.log('2. async 函数开始');
await Promise.resolve();
console.log('5. async 函数中的微任务(await)');
}
asyncFunc();
console.log('7. 同步任务结束');
4. 运行结果
运行上述代码,输出顺序如下:
1. 同步任务开始
2. async 函数开始
7. 同步任务结束
3. 微任务(Promise.then 1)
4. 微任务(Promise.then 2)
5. async 函数中的微任务(await)
6. 宏任务(setTimeout)
5. 运行机制详解
-
同步任务:
console.log('1. 同步任务开始')是同步任务,优先执行。asyncFunc()是同步任务,调用时会立即执行async函数内部的同步代码。
-
微任务:
Promise.resolve().then(...)是微任务,会在同步任务结束后执行。await Promise.resolve()会暂停asyncFunc的执行,并将后续代码放入微任务队列。
-
宏任务:
setTimeout是宏任务,会在所有微任务执行完毕后执行。
6. 执行顺序总结
-
同步任务:
console.log('1. 同步任务开始')asyncFunc()中的console.log('2. async 函数开始')console.log('7. 同步任务结束')
-
微任务:
Promise.resolve().then(...)中的console.log('3. 微任务(Promise.then 1)')Promise.resolve().then(...)中的console.log('4. 微任务(Promise.then 2)')await Promise.resolve()后的console.log('5. async 函数中的微任务(await)')
-
宏任务:
setTimeout中的console.log('6. 宏任务(setTimeout)')
7. 事件循环流程图
同步任务 -> 微任务 -> 宏任务
8. 总结
- 同步任务:优先执行。
- 微任务:在同步任务之后、宏任务之前执行。
- 宏任务:在微任务之后执行。
async/await:await会暂停async函数的执行,并将后续代码放入微任务队列。
通过这个例子,你可以清楚地看到同步任务、微任务、宏任务和 async/await 的执行顺序和优先级。