返回
理解微任务和宏任务的执行顺序
前端
2024-02-09 02:15:56
微任务和宏任务的执行顺序
在JavaScript中,微任务和宏任务是两种不同的任务队列。微任务队列比宏任务队列具有更高的优先级,因此微任务会在宏任务之前执行。
微任务
微任务包括:
- Promise.then()和Promise.catch()回调函数
- MutationObserver回调函数
- process.nextTick()回调函数
- MessageChannel消息处理程序
宏任务
宏任务包括:
- setTimeout()和setInterval()回调函数
- DOM事件处理程序(如click、mouseover等)
- script标签
- AJAX请求
执行顺序
微任务和宏任务的执行顺序如下:
- 执行同步代码
- 将微任务放入微任务队列
- 执行所有微任务
- 将宏任务放入宏任务队列
- 执行所有宏任务
- 重复步骤2-5,直到所有任务都执行完毕
Promise和async/await
Promise和async/await是JavaScript中处理异步编程的两种语法糖。
Promise
Promise对象表示一个异步操作的最终完成(或失败)及其结果值。您可以使用then()和catch()方法来处理Promise对象。
async/await
async/await语法允许您以同步的方式编写异步代码。您可以在async函数中使用await来等待Promise对象完成。
示例代码
以下示例代码演示了微任务和宏任务的执行顺序:
console.log('1');
setTimeout(() => {
console.log('2');
}, 0);
Promise.resolve().then(() => {
console.log('3');
});
console.log('4');
输出结果为:
1
4
3
2
在这个示例中,同步代码首先执行,然后将微任务放入微任务队列,接着执行所有微任务,最后将宏任务放入宏任务队列并执行所有宏任务。因此,输出结果为1、4、3、2。
注意事项
在使用微任务和宏任务时,需要注意以下几点:
- 微任务队列的优先级高于宏任务队列。
- 微任务和宏任务是异步执行的。
- 微任务和宏任务的执行顺序是先微任务后宏任务。
- Promise.then()和Promise.catch()回调函数是微任务。
- setTimeout()和setInterval()回调函数是宏任务。
- DOM事件处理程序是宏任务。
总结
微任务和宏任务是JavaScript中异步编程的重要概念。理解微任务和宏任务的执行顺序,可以帮助您编写出更加健壮的异步代码。