AbortSignal: any() 静态方法

基线 2024

新可用

2024 年 3 月起,此功能可在最新的设备和浏览器版本中使用。此功能可能在较旧的设备或浏览器中无法使用。

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

AbortSignal.any() 静态方法接收一个中止信号的可迭代对象并返回一个AbortSignal。当输入的可迭代中止信号中的任何一个中止时,返回的中止信号将中止。 中止原因 将设置为第一个中止信号的原因。如果给定的任何中止信号已中止,则返回的AbortSignal也将中止。

语法

js
AbortSignal.any(iterable)

参数

iterable

中止信号的可迭代对象(例如Array)。

返回值

一个AbortSignal,其

  • 已中止,如果给定的任何中止信号已中止。返回的AbortSignal的原因将已设置为第一个已中止的中止信号的reason
  • 异步中止,当iterable中的任何中止信号中止时。 reason 将设置为第一个中止的中止信号的原因。

示例

使用 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

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。