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 的浏览器中加载。