You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于Async/Await中多Promise执行时序的疑问

Async/Await 处理多Promise的执行时序解析

核心前提:Promise的执行特性

当你通过new Promise((resolve, reject) => { ... })创建Promise时,传入的executor函数(即括号内的回调)会立即同步执行——不管函数内部包含的是同步逻辑还是异步操作(比如setTimeout),都会在Promise创建的瞬间启动。这是理解两段代码时序差异的关键。


第一段代码解析

代码示例

const p1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve("Promise Resolved Value!!");
  }, 20000);
});

const p2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve("Promise Resolved Value!!");
  }, 10000);
});


async function handlePromise() {
  try {
    console.log("Hello World!!");
    const val = await p1;
    console.log("Namaste JavaScript");
    console.log(val);

    const val2 = await p2;
    console.log("Namaste JavaScript 2");
    console.log(val2);
  } catch (error) {
    console.error("Error:", error);
  }
}
handlePromise();

时序逻辑

  1. 程序启动后,p1和p2立即被创建,它们内部的setTimeout同时开始计时:p1的定时器为20秒,p2为10秒。
  2. 调用handlePromise(),先同步打印Hello World!!。
  3. 遇到await p1:此时p1处于pending状态,函数暂停执行,等待p1 resolve。
  4. 在等待p1的20秒内,p2的定时器在第10秒就已经触发,p2变为resolved状态,但因为handlePromise还在等待p1,所以不会继续执行后续逻辑。
  5. 第20秒时,p1 resolve,函数恢复执行:打印Namaste JavaScript和p1的值;接着遇到await p2——此时p2早已是resolved状态,await不会暂停,直接获取p2的值,继续打印后续内容。
  6. 最终表现为:等待20秒后,p1和p2的相关内容几乎同时输出。

第二段代码解析

代码示例

const p1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve("Promise Resolved Value!!");
  }, 10000);
});

const p2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve("Promise Resolved Value!!");
  }, 20000);
});


async function handlePromise() {
  try {
    console.log("Hello World!!");
    const val = await p1;
    console.log("Namaste JavaScript");
    console.log(val);

    const val2 = await p2;
    console.log("Namaste JavaScript 2");
    console.log(val2);
  } catch (error) {
    console.error("Error:", error);
  }
}

handlePromise();

时序逻辑

  1. 程序启动后,p1和p2立即被创建,内部的setTimeout同时开始计时:p1的定时器为10秒,p2为20秒。
  2. 调用handlePromise(),先同步打印Hello World!!。
  3. 遇到await p1:p1处于pending状态,函数暂停,等待p1 resolve。
  4. 第10秒时,p1 resolve,函数恢复执行:打印Namaste JavaScript和p1的值;此时遇到await p2——p2的定时器已经运行了10秒,还剩10秒才会触发,因此函数再次暂停。
  5. 又过10秒(从程序启动算起第20秒),p2 resolve,函数恢复执行,打印p2的相关内容。
  6. 最终表现为:打印Hello World!!后,等待10秒输出p1相关内容,再等待10秒输出p2相关内容(注:你描述的“等待20秒输出p1相关内容”应为笔误,实际是等待10秒)。

关键总结

  • Promise创建时立即启动内部逻辑,而非等到await时才开始执行。
  • await仅在目标Promise处于pending状态时会暂停函数;若目标Promise已为resolved状态,会直接获取结果并继续执行。

内容的提问来源于stack exchange,提问作者Redhawk18

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 06:08:14