返回

理解微任务和宏任务的执行顺序

前端

微任务和宏任务的执行顺序

在JavaScript中,微任务和宏任务是两种不同的任务队列。微任务队列比宏任务队列具有更高的优先级,因此微任务会在宏任务之前执行。

微任务

微任务包括:

  • Promise.then()和Promise.catch()回调函数
  • MutationObserver回调函数
  • process.nextTick()回调函数
  • MessageChannel消息处理程序

宏任务

宏任务包括:

  • setTimeout()和setInterval()回调函数
  • DOM事件处理程序(如click、mouseover等)
  • script标签
  • AJAX请求

执行顺序

微任务和宏任务的执行顺序如下:

  1. 执行同步代码
  2. 将微任务放入微任务队列
  3. 执行所有微任务
  4. 将宏任务放入宏任务队列
  5. 执行所有宏任务
  6. 重复步骤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中异步编程的重要概念。理解微任务和宏任务的执行顺序,可以帮助您编写出更加健壮的异步代码。