前端竞态问题解决方法
主要是通过 AbortController 来终止前一个请求。
例如:
useEffect(() => { // 创建 controller const controller = new AbortController(); // 将 controller 作为signal传递给 fetch fetch(url, { signal: controller.signal }) .then((r) => r.json()) .then((r) => { setData(r); }) .catch((error) => { // 由于 AbortController 导致的错误 if (error.name === 'AbortError') { // ... } else { // ... } }); return () => { // 中止请求 controller.abort(); }; }, [url]);
或者终止任意的promise
function wait(time: number, signal?: AbortSignal) { return new Promise<void>((resolve, reject) => { const timeoutId = setTimeout(() => { resolve(); }, time); signal?.addEventListener('abort', () => { clearTimeout(timeoutId); reject(); }); }); } const abortController = new AbortController(); setTimeout(() => { abortController.abort(); }, 1000); wait(5000, abortController.signal) .then(() => { console.log('5 seconds passed'); }) .catch(() => { console.log('Waiting was interrupted'); });
出处: https://mp.weixin.qq.com/s/Ja1Fmehn3pIiUPDoAnoL1Q
https://mp.weixin.qq.com/s/KHxkXW7vUKZKeG9EBe5KcQ
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具