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

函数返回Promise与直接创建Promise在async/await中执行差异原因问询

两种async/await执行行为差异的原因解释

核心底层规则

Promise 实例的 executor 函数(即传入 new Promise() 的回调函数)会在实例创建的那一刻同步执行,和后续是否使用 await 无关。await 的作用仅为暂停当前 async 函数的执行,等待目标 Promise 状态变更为 fulfilled 后再继续执行后续代码,它不会控制 Promise 本身的异步任务启动时机。

第一种串行执行场景的逻辑

你通过函数返回 Promise 的写法中,Promise 实例是按顺序延迟创建的:

const func = async () => {
  // 执行到当前行时才调用setTimer(1),创建第一个Promise实例,启动第一个2秒定时器
  const first = await setTimer(1)
  console.log(first);
  // 第一个Promise resolve后,才会执行到当前行,调用setTimer(2)创建第二个Promise,启动第二个2秒定时器
  const second = await setTimer(2)
  console.log(second);
  // 第二个Promise resolve后,才会创建第三个Promise,启动第三个定时器
  const third = await setTimer(3)
  console.log(third);
}

三个定时器依次启动,总耗时为 2*3=6 秒,表现为串行执行。

第二种并行执行场景的逻辑

你提前声明三个独立 Promise 实例时,三个实例的创建动作是同步依次完成的,对应的三个定时器几乎同时启动:

// 代码加载到当前行就立刻创建第一个Promise,启动第一个2秒定时器
const setTimer1 = new Promise((res, rej) => {
  setTimeout(() => res(1), 2000);
})
// 紧接着立刻创建第二个Promise,启动第二个2秒定时器
const setTimer2 = new Promise((res, rej) => {
  setTimeout(() => res(2), 2000);
})
// 紧接着立刻创建第三个Promise,启动第三个2秒定时器
const setTimer3 = new Promise((res, rej) => {
  setTimeout(() => res(3), 2000);
})

三个定时器同时计时,2秒后三个 Promise 几乎同时变为 fulfilled 状态。你在 func1 中按顺序 await 时,第一个 await 等待2秒拿到结果后,后两个 Promise 已经是完成状态,不需要额外等待,因此会立刻输出后续结果,总耗时仅2秒左右,表现为并行执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 20:15:01