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

瀏覽器相容性