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

如何让一个Promise在另一个Promise resolve后执行?代码异常排查

为什么你的Promise代码5秒就输出,而非预期的10秒?

核心误区:Promise创建即执行

你误解了Promise的执行时机——当你用new Promise()创建一个Promise对象时,它内部的 executor 函数(就是你传的(res, rej) => {...})会立刻同步执行,根本不会等到你调用.then()或者await的时候才启动任务。

看你的代码:

const task1 = new Promise((res, rej) => {
  setTimeout(() => res('one'), 5000)
})

const task2 = new Promise((res, rej) => {
  setTimeout(() => res('two'), 5000)
})

这两行代码一执行,task1和task2内部的定时器就同时开始计时了,两者的5秒是并行跑的,不是先后顺序。

解释你的两段代码行为

1. .then()链的情况

  • 5秒后,task1和task2同时resolve。
  • task1.then()触发时,task2已经是resolved状态了,所以你return Promise.resolve(task2)(等价于直接return task2)会立刻让下一个.then()拿到结果,自然5秒就输出了。

2. async/await的情况

  • 同样,task1和task2的定时器一开始就并行跑了。
  • await task1等待5秒完成,但这时候task2的5秒也已经跑完了,所以await task2根本不需要等,直接拿到结果,因此也是5秒输出。

如何实现串行执行(10秒后输出)

如果想要让task2在task1完成后再启动,你需要延迟创建task2,比如把它放到task1的.then()回调里,或者放到await task1之后:

写法一:修改.then()链

const task1 = new Promise((res) => setTimeout(() => res('one'), 5000));

task1
.then(() => {
    // 直到task1完成,才创建task2并启动定时器
    const task2 = new Promise((res) => setTimeout(() => res('two'), 5000));
    return task2;
})
.then(res => console.log(res)); // 10秒后输出'two'

写法二:修改async/await函数

async function test() {
  try {
    // 先等task1完成(5秒)
    const res = await new Promise((res) => setTimeout(() => res('one'), 5000));
    // 再创建并等待task2(又5秒)
    const res2 = await new Promise((res) => setTimeout(() => res('two'), 5000));
    console.log(res2); // 10秒后输出'two'
  } catch (error) {
    console.error(error);
  }
}

test();

更优雅的写法:把任务封装成函数

如果需要多次复用任务,把它们写成返回Promise的函数,调用时才执行:

// 封装成函数,调用才创建Promise并启动定时器
const runTask1 = () => new Promise((res) => setTimeout(() => res('one'), 5000));
const runTask2 = () => new Promise((res) => setTimeout(() => res('two'), 5000));

async function test() {
  await runTask1(); // 先跑task1,等5秒
  const res2 = await runTask2(); // 再跑task2,又等5秒
  console.log(res2); // 10秒后输出
}

test();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 08:00:25