async/await、事件、同步任务、宏任务和微任务的运行优先级和机制。

81 阅读2分钟

2. 运行优先级

JavaScript 的事件循环(Event Loop)按照以下顺序执行任务:

  1. 同步任务:优先执行。
  2. 微任务:在同步任务之后、下一个宏任务之前执行。
  3. 宏任务:在微任务之后执行。

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. 运行机制详解

  1. 同步任务

    • console.log('1. 同步任务开始') 是同步任务,优先执行。
    • asyncFunc() 是同步任务,调用时会立即执行 async 函数内部的同步代码。
  2. 微任务

    • Promise.resolve().then(...) 是微任务,会在同步任务结束后执行。
    • await Promise.resolve() 会暂停 asyncFunc 的执行,并将后续代码放入微任务队列。
  3. 宏任务

    • setTimeout 是宏任务,会在所有微任务执行完毕后执行。

6. 执行顺序总结

  1. 同步任务

    • console.log('1. 同步任务开始')
    • asyncFunc() 中的 console.log('2. async 函数开始')
    • console.log('7. 同步任务结束')
  2. 微任务

    • 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)')
  3. 宏任务

    • setTimeout 中的 console.log('6. 宏任务(setTimeout)')

7. 事件循环流程图

同步任务 -> 微任务 -> 宏任务

8. 总结

  • 同步任务:优先执行。
  • 微任务:在同步任务之后、宏任务之前执行。
  • 宏任务:在微任务之后执行。
  • async/awaitawait 会暂停 async 函数的执行,并将后续代码放入微任务队列。

通过这个例子,你可以清楚地看到同步任务、微任务、宏任务和 async/await 的执行顺序和优先级。