AbortSignal: any() 静态方法

Baseline 2024
新推出

自 ⁨2024 年 3 月⁩ 起,此功能可在最新的设备和浏览器版本上运行。此功能可能不适用于较旧的设备或浏览器。

注意:此功能在 Web Workers 中可用。

AbortSignal.any() 静态方法接受一个 abort signals 可迭代对象,并返回一个 AbortSignal。当输入的任何一个 abort signal 被中止时,返回的 abort signal 也会被中止。其 中止原因 将被设置为第一个被中止的信号的原因。如果给定的任何 abort signals 已经被中止,那么返回的 AbortSignal 也会被中止。

语法

js
AbortSignal.any(iterable)

参数

iterable

一个 abort signals 的 可迭代对象(例如 Array)。

返回值

一个 AbortSignal,它:

  • 已中止,如果给定的 abort signals 中有任何一个已经被中止。返回的 AbortSignal 的原因将设置为第一个已被中止的 abort signal 的 reason
  • 异步中止,当 iterable 中的任何一个 abort signal 被中止时。其 reason 将被设置为第一个被中止的 abort signal 的原因。

示例

使用 AbortSignal.any()

此示例演示了如何结合使用来自 AbortController 的信号和来自 AbortSignal.timeout 的超时信号。

js
const cancelDownloadButton = document.getElementById("cancelDownloadButton");

const userCancelController = new AbortController();

cancelDownloadButton.addEventListener("click", () => {
  userCancelController.abort();
});

// Timeout after 5 minutes
const timeoutSignal = AbortSignal.timeout(1_000 * 60 * 5);

// This signal will abort when either the user clicks the cancel button or 5 minutes is up
// whichever is sooner
const combinedSignal = AbortSignal.any([
  userCancelController.signal,
  timeoutSignal,
]);

try {
  const res = await fetch(someUrlToDownload, {
    // Stop the fetch when any of the signals aborts
    signal: combinedSignal,
  });
  const body = await res.blob();
  // Do something with downloaded content:
  // …
} catch (e) {
  if (e.name === "AbortError") {
    // Cancelled by the user
  } else if (e.name === "TimeoutError") {
    // Show user that download timed out
  } else {
    // Other error, e.g. network error
  }
}

规范

规范
DOM
# dom-abortsignal-any

浏览器兼容性