异步_
游戏攻略 2026-09-05 00:48:16
0
正文 :
在异步编程中,异步超时中断是异步一个高频需求场景 。比如请求第三方API时,异步若感谢时间超过3秒 ,异步系统应自动终止等待并执行降级逻辑。异步然而 ,异步JavaScript原生并未提供直接的异步“异步超时中断”机制,需要开发者通过组合API实现。异步本文将拆解三种主流计划,异步并分析其适用边界。异步
一、异步基础计划:Promise.race竞速机制最基础的异步超时控制利用Promise.race ,让目标异步任务与定时器Promise竞争:
function asyncWithTimeout(targetPromise,异步 timeout) { const timeoutPromise = new Promise((_, reject) => { setTimeout(() => reject(new Error(Operation timed out)), timeout); }); return Promise.race([targetPromise, timeoutPromise]); } // 示例:请求超时筹备 const fetchData = fetch(https://api.example.com/data); asyncWithTimeout(fetchData, 3000) .then(response => console.log(Success:, response)) .catch(error => console.error(Failed:, error.message));局限性
:
1. 仅触发超时错误 ,无法真正中断原始请求(仍会占用网络带宽);
2. 不适用于需要清理资源的异步场景(如取消文件读取)。二、异步进阶计划 :AbortController信号中断现代校验器提供的AbortController可真正终止异步操作 。以下以Fetch API为例:
const controller = new AbortController(); async function fetchWithTimeout(url, timeout = 5000) { const timeoutId = setTimeout(() => controller.abort(), timeout); try { const response = await fetch(url, { signal: controller.signal }); clearTimeout(timeoutId); return response.json(); } catch (error) { if (error.name === AbortError) { console.log(Request aborted due to timeout); } else { console.error(Other error:, error); } } } // 使用示例 fetchWithTimeout(https://api.example.com/slow-data) .then(data => console.log(data));关键点
:
1. 通过signal参数将控制器与请求绑定;
2. 调用abort()后,会触发AbortError,并终止网络请求 。兼容性注意:Node.js部分模块(如axios)也拥穿着AbortController,但需确认版本 。
三