AbortSignal.any 是 JavaScript 中用于组合多个 AbortSignal 的静态方法,它返回一个新信号,只要任意一个输入信号被中止,该信号立即中止,适用于竞速请求、超时与用户取消双保险等场景。

AbortSignal.any 是 JavaScript 中用于组合多个 AbortSignal 的静态方法,它返回一个新的信号:只要**任意一个输入信号被中止(aborted)**,这个新信号就立即中止。它不等待全部完成,也不关心哪个先触发,只响应“第一个取消”——适合实现“任一失败即整体取消”的场景,比如竞速请求、超时 + 用户手动取消双保险等。
基本用法:传入信号数组,得到聚合信号
你只需把多个 AbortSignal 实例(来自 AbortController.signal)放进一个数组,传给 AbortSignal.any():
const controller1 = new AbortController(); const controller2 = new AbortController(); const combinedSignal = AbortSignal.any([ controller1.signal, controller2.signal ]); // 任一 controller 调用 .abort(),combinedSignal 就会触发 abort 事件 controller1.abort(); // → combinedSignal.aborted 变为 true,且触发 'abort' 事件
典型应用场景:网络请求 + 超时 + 用户取消三合一
常见需求:发一个 fetch 请求,同时支持「10 秒超时」和「用户点击取消按钮」,任一发生就中止请求。
- 创建两个独立的
AbortController:一个用于超时,一个用于 UI 取消 - 用
AbortSignal.any合并它们,传给fetch - 超时控制器在
setTimeout中调用.abort();UI 控制器由按钮点击触发
示例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
const timeoutController = new AbortController();
const cancelController = new AbortController();
// 10 秒后自动中止
setTimeout(() => timeoutController.abort(), 10_000);
// 假设有个按钮:button.addEventListener('click', () => cancelController.abort());
const signal = AbortSignal.any([
timeoutController.signal,
cancelController.signal
]);
try {
const res = await fetch('/api/data', { signal });
console.log(await res.json());
} catch (err) {
if (err.name === 'AbortError') {
console.log('请求被取消(超时或用户主动取消)');
}
}
注意事项和边界情况
-
空数组会抛错:调用
AbortSignal.any([])会抛出TypeError,至少传一个信号 -
已中止的信号会被忽略:如果某个信号在传入前已是
aborted: true,它不会影响结果,但一旦有任一信号变为中止状态,结果信号立刻中止 -
不处理成功/完成:它只响应中止,不关心原始操作是否成功;也不提供“全部完成才中止”逻辑(那是
AbortSignal.all的职责,但该方法目前尚未标准化) - 浏览器兼容性:Chrome 115+、Firefox 117+、Safari 17.4+ 支持;旧版需 polyfill 或降级为手动监听多个信号
与手动监听多个信号对比
不用 any 时,你得自己写逻辑监听多个信号的 abort 事件,并确保只触发一次中止:
const signal1 = controller1.signal;
const signal2 = controller2.signal;
const combinedController = new AbortController();
const { signal } = combinedController;
if (signal1.aborted || signal2.aborted) {
combinedController.abort();
} else {
signal1.addEventListener('abort', () => combinedController.abort(), { once: true });
signal2.addEventListener('abort', () => combinedController.abort(), { once: true });
}
而 AbortSignal.any 就是这个模式的标准化、简洁、可靠封装——推荐优先使用。

















