为什么JavaScript没有原生的方式,在一个Promise失败时就取消Promise.all?

前端开发 2026-07-10

我正在进行多项异步操作,使用 Promise.all

const promises = [
  fetch("/api/1"),
  fetch("/api/2"),
  fetch("/api/3"),
];

await Promise.all(promises);

据我知,如果其中一个Promise被拒绝,Promise.all 会立刻被拒绝。
然而,其他的Promise仍在后台继续执行。
在某些情况下,如果其中一个失败,我不希望剩余的操作继续进行。

在这种情况下,是否有内置的或推荐的模式来停止或取消剩余的异步操作?

解决方案

你不能直接取消Promise,但如果底层的异步操作支持取消,你就可以取消它们(例如,通过 AbortController 来取消 fetch)。

关键在于让所有请求共享同一个 AbortSignal,这样就能一起取消它们。

const controller = new AbortController();
const { signal } = controller;

const promises = [
  fetch("/api/1", { signal }),
  fetch("/api/2", { signal }),
  fetch("/api/3", { signal }),
];

try {
  await Promise.all(promises);
} catch (err) {
  controller.abort(); // cancel remaining requests
  throw err;
}

自定义的异步代码不支持AbortController,必须手动实现。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章