返回

前端异步调度的关键——微任务和宏任务

前端

前端开发中,异步任务是指不阻塞当前线程的任务,它允许浏览器继续执行其他任务,而不会等待异步任务完成。微任务和宏任务是两种常见的异步任务类型,它们在执行优先级和处理方式上有所不同。本文将介绍微任务和宏任务的概念,并通过代码示例详细解释它们的执行顺序和处理过程,帮助前端开发者更深入地理解异步调度机制。

微任务和宏任务的概念

微任务是浏览器在执行完所有同步任务后立即执行的任务,它包括:

  • Promise.then() 和 async/await
  • MutationObserver
  • Object.observe()
  • MessageChannel

宏任务是浏览器在执行完所有微任务后执行的任务,它包括:

  • setTimeout()
  • setInterval()
  • setImmediate()
  • requestAnimationFrame()
  • I/O操作(如网络请求、文件读取等)

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

微任务和宏任务的执行顺序遵循以下规则:

  1. 浏览器先执行所有同步任务。
  2. 浏览器执行所有微任务。
  3. 浏览器执行所有宏任务。

微任务和宏任务的处理方式

微任务和宏任务的处理方式有所不同。微任务是在主线程中执行的,而宏任务是在新的线程中执行的。这意味着微任务的执行速度要比宏任务快。

代码示例

以下代码示例演示了微任务和宏任务的执行顺序:

console.log('同步任务1');

Promise.resolve().then(() => {
  console.log('微任务1');
});

setTimeout(() => {
  console.log('宏任务1');
}, 0);

console.log('同步任务2');

Promise.resolve().then(() => {
  console.log('微任务2');
});

setTimeout(() => {
  console.log('宏任务2');
}, 0);

console.log('同步任务3');

输出结果:

同步任务1
同步任务2
同步任务3
微任务1
微任务2
宏任务1
宏任务2

从输出结果可以看出,同步任务先执行,然后是微任务,最后是宏任务。微任务的执行速度要比宏任务快。

总结

微任务和宏任务是前端开发中两种常见的异步任务类型,它们在执行优先级和处理方式上有所不同。微任务是在主线程中执行的,而宏任务是在新的线程中执行的。这意味着微任务的执行速度要比宏任务快。