AbortSignal:timeout() 静态方法

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

AbortSignal.timeout() 静态方法返回一个AbortSignal,该信号将在指定时间后自动中止。

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

超时基于活动时间而不是经过时间,如果代码在挂起的 worker 中运行,或者文档处于前后缓存中(“bfcache”),则超时将有效地暂停。

要组合多个信号,可以使用AbortSignal.any(),例如,直接使用超时信号或通过调用AbortController.abort()来中止下载。

语法

js
AbortSignal.timeout(time)

参数

time

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

返回值

一个AbortSignal

信号将中止,其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}`);
  }
}

规范

规范
DOM 标准
# ref-for-dom-abortsignal-timeout①

浏览器兼容性

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