AbortSignal.timeout()

静态方法 AbortSignal.timeout() 返回一个指定时间后将自动中止的 AbortSignal

信号在超时时使用 TimeoutError DOMException 中止,或者由于按下一个浏览器停止按钮(或者一些内置的“停止”操作)而使用 AbortError DOMException 中止。这允许 UI 区分超时错误(通常需要通知用户)和用户触发的错误(不需要通知用户)。

超时将基于活动的时间,而不是经过的时间,如果代码在指定的 worker 中运行或者文档在往返缓存时(bfcache),将有效地暂停。

备注: 在编写代码时,无法组合多个信号。意思是你不能使用超时的 signal 或者通过调用 AbortController.abort() 直接中止下载。

语法

js
AbortSignal.timeout(time)

参数

time

返回的 AbortSignal 将中止之前的“活动”时间(以毫秒为单位)。

返回值

一个 AbortSignal

signal 中止,并且 AbortSignal.reason 属性将在超时时设置一个 TimeoutError DOMException,如果操作是用户触发的,则为 AbortError DOMException

示例

以下简单示例展示了一个 fetch 操作,如果其在 5 秒后不成功,则超时。注意,如果不支持该方法、按下浏览器的“停止”按钮或其他原因,也可能失败。

js
const url = "https://path_to_large_file.mp4";

try {
  const res = await fetch(url, { signal: AbortSignal.timeout(5000) });
  const result = await res.blob();
  // …
} catch (err) {
  if (err.name === "TimeoutError") {
    console.error("Timeout: It took more than 5 seconds to get the result!");
  } else if (err.name === "AbortError") {
    console.error(
      "Fetch aborted by user action (browser stop button, closing tab, etc.",
    );
  } else if (err.name === "TypeError") {
    console.error("AbortSignal.timeout() method is not supported");
  } else {
    // A network error, or some other problem.
    console.error(`Error: type: ${err.name}, message: ${err.message}`);
  }
}

规范

Specification
DOM Standard
# ref-for-dom-abortsignal-timeout①

浏览器兼容性

BCD tables only load in the browser