当前位置: 首页 > article >正文

跟着 MDN 学 HTML day_30:(AbortController 实现可取消的异步请求)

在现代 Web 开发中异步操作随处可见尤其是网络请求。但有时候我们需要主动取消一个正在进行的请求比如用户切换了页面、重复提交表单、或者文件下载被中断。传统的做法往往难以优雅地处理这些场景。AbortController的出现为我们提供了一套标准化、可复用的中止机制。一、AbortController 是什么AbortController 是一个内置的 Web API它允许我们主动取消一个或多个正在进行的异步操作。最典型的应用场景是与 Fetch API 配合取消正在发送的网络请求。它的核心设计思路是将“控制权”和“信号”分离控制器负责发出中止指令信号对象负责将这个指令传递给具体的异步操作。// 创建一个控制器实例constcontrollernewAbortController();// 获取与该控制器关联的信号对象constsignalcontroller.signal;// 监控信号是否被中止signal.addEventListener(abort,(){console.log(操作已被取消原因为,signal.reason);});// 在需要的时候调用 abort 方法controller.abort();// 输出: 操作已被取消原因为AbortError需要注意的是每个 AbortController 实例只能使用一次。一旦调用了 abort 方法关联的 signal 状态就会变成“已中止”无法逆转。二、构造函数与实例属性AbortController 的 API 设计非常简洁。通过构造函数创建实例后最常用的属性就是 signal它返回一个 AbortSignal 对象用于向异步操作传递取消信号。// 演示 signal 属性的使用functioncreateCancellableOperation(){constcontrollernewAbortController();const{signal}controller;console.log(信号初始状态:,signal.aborted);// false// 设置一个定时器5秒后自动取消consttimeoutIdsetTimeout((){controller.abort();console.log(信号中止后状态:,signal.aborted);// trueconsole.log(中止原因:,signal.reason);},5000);return{controller,signal};}const{controller,signal}createCancellableOperation();// 可以在任意时刻主动取消// controller.abort();signal 对象还有一个 aborted 属性用于判断操作是否已经被取消。在实际开发中我们通常会将 signal 作为参数传递给支持取消机制的异步函数。三、abort 方法的核心用法abort 方法是 AbortController 的灵魂。调用它会触发 signal 的 abort 事件同时将 signal.aborted 设置为 true。传入可选的 reason 参数可以更好地描述取消的原因。// 演示带原因的中止操作asyncfunctionfetchWithCustomAbort(url){constcontrollernewAbortController();constsignalcontroller.signal;// 5秒后自动取消请求并指定原因consttimeoutIdsetTimeout((){controller.abort(请求超时已自动取消);},5000);try{constresponseawaitfetch(url,{signal});clearTimeout(timeoutId);constdataawaitresponse.json();console.log(请求成功:,data);returndata;}catch(error){if(error.nameAbortError){console.log(请求被取消原因:,signal.reason);}else{console.log(请求出错:,error);}}}// 手动取消的示例constmanualControllernewAbortController();manualController.abort(用户点击了取消按钮);// 此时 manualController.signal.reason 的值为 用户点击了取消按钮从 98 版本开始的 Chrome 和 97 版本的 Firefox 开始abort 方法支持传入自定义的 reason 参数这大大方便了错误追踪和用户提示。四、中止 Fetch 请求的完整示例这是 AbortController 最经典的应用场景。当用户快速切换页面或者重复提交表单时我们可以取消那些不再需要的请求节省带宽并避免状态混乱。// 完整的视频下载控制示例classVideoDownloader{constructor(){this.currentControllernull;this.downloadBtndocument.getElementById(downloadBtn);this.abortBtndocument.getElementById(abortBtn);this.statusDivdocument.getElementById(status);this.downloadBtn.addEventListener(click,()this.startDownload());this.abortBtn.addEventListener(click,()this.cancelDownload());}asyncstartDownload(){// 如果已有下载在进行先取消它if(this.currentController){this.currentController.abort(新的下载任务已启动);}this.currentControllernewAbortController();constsignalthis.currentController.signal;this.statusDiv.textContent下载中...;this.downloadBtn.disabledtrue;this.abortBtn.disabledfalse;try{constresponseawaitfetch(/large-video.mp4,{signal});if(!response.ok){thrownewError(HTTP${response.status});}constvideoBlobawaitresponse.blob();this.statusDiv.textContent下载完成;console.log(视频大小:,(videoBlob.size/1024/1024).toFixed(2),MB);}catch(error){if(error.nameAbortError){this.statusDiv.textContent下载已取消;}else{this.statusDiv.textContent下载失败:${error.message};}}finally{this.downloadBtn.disabledfalse;this.abortBtn.disabledtrue;this.currentControllernull;}}cancelDownload(){if(this.currentController){this.currentController.abort(用户主动取消);console.log(已发送取消指令);}}}// 初始化下载器newVideoDownloader();当 abort 方法被调用时fetch 返回的 Promise 会立即 reject错误对象的名字为 AbortError。通过捕获这个特定错误我们可以给用户提供清晰的状态反馈。五、同时中止多个请求AbortController 的一个强大特性是一个控制器可以关联多个异步操作。这意味着我们可以用一个“总开关”同时取消多个请求。// 批量请求的中止管理asyncfunctionsearchProducts(keyword){constcontrollernewAbortController();constsignalcontroller.signal;// 同时发起三个相关的 API 请求constendpoints[/api/products?q${keyword},/api/categories?q${keyword},/api/recommendations?q${keyword}];constpromisesendpoints.map(endpointfetch(endpoint,{signal}).then(resres.json()).catch(err{if(err.name!AbortError){console.error(${endpoint}请求失败:,err);}returnnull;}));// 设置超时自动取消consttimeoutIdsetTimeout((){controller.abort(搜索超时);console.log(已取消所有搜索请求);},3000);try{constresultsawaitPromise.all(promises);clearTimeout(timeoutId);const[products,categories,recommendations]results;return{products,categories,recommendations};}catch(error){if(error.nameAbortError){console.log(搜索请求已取消);}throwerror;}finally{clearTimeout(timeoutId);}}// 使用示例letcurrentSearchnull;asyncfunctionhandleSearch(){// 清除之前的搜索if(currentSearch){currentSearch.abort();}constkeyworddocument.getElementById(searchInput).value;constcontrollernewAbortController();currentSearchcontroller;try{constresultsawaitsearchProducts(keyword);console.log(搜索结果:,results);}catch(error){if(error.name!AbortError){console.error(搜索出错:,error);}}finally{if(currentSearchcontroller){currentSearchnull;}}}这种模式在实现搜索建议、数据预取、或者需要清理旧请求的场景中非常实用。六、浏览器兼容性与注意事项AbortController 在现代浏览器中得到了广泛支持。Chrome 66、Firefox 57、Safari 12.1、Edge 16 及以上版本都完全支持。Node.js 从 14.17 版本开始也支持了这个 API。在使用时需要注意以下几点每个控制器只能使用一次中止后无法重置不是所有异步操作都支持 AbortSignal目前原生支持的主要是 Fetch API、某些流操作以及部分 Node.js API在取消请求后服务器端可能仍在处理请求取消只影响客户端等待响应的行为。// 兼容性处理示例functioncreateCancellableFetch(url,options{}){// 检测是否支持 AbortControllerif(typeofAbortControllerundefined){console.warn(当前环境不支持 AbortController将发起不可取消的请求);returnfetch(url,options);}constcontrollernewAbortController();constrequestfetch(url,{...options,signal:controller.signal});// 返回增强的 Promise附加 cancel 方法constcancellablePromiserequest;cancellablePromise.cancel()controller.abort();returncancellablePromise;}// 使用示例constfetchTaskcreateCancellableFetch(/api/data);fetchTask.catch(error{if(error.nameAbortError){console.log(用户取消了请求);}});// 需要取消时// fetchTask.cancel();AbortController 的出现让前端开发者终于有了一个标准化的方式来取消异步操作。掌握它的用法可以让我们在处理复杂用户交互时写出更加健壮和优雅的代码。想要解锁更多HTML 核心标签实战、前端零基础入门干货、开发避坑全指南吗持续关注后续将更新CSS 布局实战、JavaScript 交互基础、全站导航开发等硬核内容带你从新手快速进阶轻松搞定前端开发

相关文章:

跟着 MDN 学 HTML day_30:(AbortController 实现可取消的异步请求)

在现代 Web 开发中,异步操作随处可见,尤其是网络请求。但有时候我们需要主动取消一个正在进行的请求,比如用户切换了页面、重复提交表单、或者文件下载被中断。传统的做法往往难以优雅地处理这些场景。AbortController 的出现,为我…...

PL/SQL:异常处理补充

PL/SQL异常处理补充:本文在基础异常处理语法基础上,重点补充了5个实用知识点:常见预定义异常(如NO_DATA_FOUND)及其应用场景;两种自定义异常实现方式(异常别名与RAISE_APPLICATION_ERROR&#x…...

离线优先的Markdown编辑器:inkdown如何实现极致专注写作

1. 项目概述:一个为创作者而生的轻量级写作工具如果你和我一样,经常需要在不同设备间切换写作,或者对市面上那些功能臃肿、界面花哨的写作软件感到厌倦,那么你可能会对inkdown产生兴趣。这不是一个功能大而全的“巨无霸”&#xf…...

ASIC功能验证:基于规范的方法与Specman实战

1. ASIC功能验证的现状与挑战在当今的芯片设计领域,功能验证已成为决定项目成败的关键环节。作为一名从业十余年的验证工程师,我亲眼见证了ASIC设计规模从几十万门级发展到如今的数亿门级,而验证复杂度却呈指数级增长。传统验证方法在面对这种…...

PMP管理大数据学习建议

本文提出用PMP五大过程组管理大数据开发学习,建议: 启动阶段明确学习边界,制定项目章程(如6周掌握PythonOracle核心);规划阶段细化WBS分解(Python语法→数据结构→Oracle SQL→PL/SQL&#xff0…...

别再刷后台了!我用凌风工具箱导出竞价表格,摸清所有对手底牌

做Temu一年多,我最怕的不是报不上活动,不是物流延迟,而是——竞价。每次打开商家后台的竞价管理页面,看着密密麻麻的商品列表和不断跳动的竞价倒计时,心里就开始发慌。哪个品该竞价、哪个该守住、哪个该放弃&#xff1…...

基于MCP协议的AI智能体实时金融数据工具箱Tickerr详解

1. 项目概述:一个为AI智能体打造的实时金融数据工具箱最近在折腾AI智能体(Agent)开发,特别是想让它们能处理一些实时性要求高的任务,比如监控股票价格、追踪新闻动态。我发现,要让一个智能体真正“理解”并…...

别再手动下架了!Temu查重复铺货那晚,我10分钟救了三个店

上周三晚上十一点多,我正准备关电脑睡觉,群里突然炸了。“卧槽,三个店全收到重复铺货警告!几十条链接被标记了!”我瞬间睡意全无。你们知道的,Temu现在对重复铺货是零容忍——一旦触发,直接下架…...

轻量级定时任务调度库timetask:配置即代码的Python实践指南

1. 项目概述与核心价值最近在折腾个人效率工具链,发现一个挺有意思的开源项目,叫haikerapples/timetask。乍一看名字,可能觉得就是个简单的定时任务工具,但深入把玩之后,我发现它的设计理念和实现方式,恰好…...

OpenCode集成Cursor Pro:通过代理架构实现AI编程工具的无缝桥接

1. 项目概述:打破限制,将 Cursor Pro 无缝接入 OpenCode 如果你和我一样,既是 Cursor Pro 的深度用户,又对 OpenCode 这个开源、可扩展的 AI 编程环境情有独钟,那你一定遇到过那个令人头疼的“二选一”困境。Cursor 的…...

RAGxplorer:可视化调试工具,提升检索增强生成系统可观测性

1. 项目概述:RAGxplorer,一个为RAG系统打造的“X光机”如果你正在构建或优化一个基于检索增强生成(RAG)的系统,那么你一定遇到过这样的困惑:为什么用户的问题没有得到预期的答案?是检索的文档不…...

Syncia:基于浏览器扩展的AI助手,实现网页上下文智能处理与本地模型集成

1. 项目概述:一个让AI能力随处可用的浏览器助手 如果你和我一样,每天大部分时间都泡在浏览器里,处理文档、阅读文章、查找资料,那你肯定也想过:要是能把ChatGPT的能力直接“嵌入”到每一个网页里,随时帮我…...

BricksLLM:开源LLM API网关,解决大模型应用成本管控与用量追踪难题

1. 项目概述:当大模型应用遇上“计费墙” 最近在折腾大模型应用的后端服务,一个绕不开的痛点就是成本核算。无论是内部团队使用,还是对外提供SaaS服务,只要接入了OpenAI、Anthropic这些按Token收费的第三方模型,账单管…...

如何用C语言解密网易云NCM音乐文件:实现跨平台音乐格式转换

如何用C语言解密网易云NCM音乐文件:实现跨平台音乐格式转换 【免费下载链接】ncmToMp3 网易云vip的ncm文件转mp3/flac - ncm file to mp3 or flac 项目地址: https://gitcode.com/gh_mirrors/nc/ncmToMp3 你是否曾经在网易云音乐下载了VIP歌曲,却…...

从循环处理、全局工作空间到高阶理论:AI架构的意识功能映射与工程启示

1. 项目概述:一场关于智能本质的跨界探索最近和几位做认知科学和哲学的朋友聊天,聊到了一个特别有意思的话题:我们整天在搞的AI,尤其是那些大语言模型,它们到底有没有可能产生“意识”?或者说,我…...

构建办公自动化CLI工具集:从Python库选型到实战应用

1. 项目概述:一个面向办公效率的CLI工具集如果你和我一样,每天大部分时间都泡在终端里,那么“officecli/officecli-skills”这个项目标题,一眼就能让你兴奋起来。它直指一个非常具体且高频的痛点:如何在命令行&#xf…...

AI编程助手代码审计工具whatdiditdo:从黑盒到白盒的智能复盘

1. 项目概述:当AI替你写代码后,如何快速复盘?如果你和我一样,已经深度依赖AI编程助手(比如Cursor、GitHub Copilot、Claude Code)来加速日常开发,那你一定遇到过这个场景:你给AI下了…...

透明计费与用量明细让个人开发者的项目预算更加清晰

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 透明计费与用量明细让个人开发者的项目预算更加清晰 对于独立开发者或小型团队而言,在集成大模型能力时,成…...

YAPI MCP PRO:基于MCP协议将YApi无缝集成AI代码编辑器的实践指南

1. 项目概述与核心价值如果你和我一样,每天都要在YApi里翻找接口文档、复制粘贴路径和参数,然后切回代码编辑器去写调用逻辑,那这个循环一定让你感到疲惫。更别提当后端同事更新了接口,你还在用旧参数调试的尴尬场景。YAPI MCP PR…...

ClawScript:专为量化交易与AI自动化设计的领域特定语言

1. 项目概述:ClawScript,一个为交易与自动化而生的领域特定语言如果你像我一样,在量化交易和自动化流程的构建上投入了大量时间,那你一定对那种在通用编程语言的灵活性与专用交易平台的便捷性之间反复横跳的体验深有感触。用Pytho…...

基于Tauri+React的AI编码代理实时监控工具设计与实践

1. 项目概述:一个为AI编码代理打造的实时监控桌面应用如果你和我一样,日常开发中重度依赖像Claude Code、OpenCode这类AI编码代理,那你肯定也遇到过这个痛点:当同时运行多个代理任务时,它们各自在独立的终端窗口里埋头…...

PotPlayer字幕翻译插件高级配置与性能优化深度解析

PotPlayer字幕翻译插件高级配置与性能优化深度解析 【免费下载链接】PotPlayer_Subtitle_Translate_Baidu PotPlayer 字幕在线翻译插件 - 百度平台 项目地址: https://gitcode.com/gh_mirrors/po/PotPlayer_Subtitle_Translate_Baidu PotPlayer字幕翻译插件是一款基于百…...

G-Helper华硕笔记本终极控制指南:5分钟掌握性能优化与电池保护技巧

G-Helper华硕笔记本终极控制指南:5分钟掌握性能优化与电池保护技巧 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook,…...

生成式AI艺术审美:从技术原理到人机协作的评判框架

1. 项目概述:当AI拿起画笔,我们如何评判它的“美”?最近几年,生成式AI的爆发,让“人工智能创作”从一个科幻概念变成了我们每天都能刷到的现实。从Midjourney绘制的赛博朋克城市,到Stable Diffusion生成的古…...

基于MCP协议实现AI助手本地读取Mac短信:原理、部署与应用场景

1. 项目概述:一个让AI助手“读懂”你Mac短信的桥梁如果你是一个重度依赖AI助手(比如Claude、Cursor等)进行编程、写作或日常信息处理的Mac用户,可能经常遇到一个痛点:当你想让AI帮你分析一段短信对话、查找某个联系人发…...

基于Claude AI的ASO自动化审计工具:从用户评论到文案优化的智能分析实践

1. 项目概述与核心价值最近在跟几个做ASO(应用商店优化)的朋友聊天,发现大家普遍有个痛点:面对海量的应用商店评论、榜单数据和竞品动态,人工分析不仅耗时耗力,还容易遗漏关键信息。我们经常需要从一堆看似…...

【最新 v2.7.1 版本】OpenClaw v2.7.1 一键安装包|Windows 稳定极速部署

OpenClaw 一键安装包|一键部署,告别复杂环境配置 ✨ 适配系统:Windows 10/11 64 位 当前版本:v2.7.1(虾壳云版) 核心优势:全程可视化操作,无需命令行、无需手动配置 Python/Node.…...

CANN/pyasc:add_deq_relu API文档

asc.language.basic.add_deq_relu 【免费下载链接】pyasc 本项目为Python用户提供算子编程接口,支持在昇腾AI处理器上加速计算,接口与Ascend C一一对应并遵守Python原生语法。 项目地址: https://gitcode.com/cann/pyasc asc.language.basic.add_…...

Llama-Chinese中文优化实战:从数据构建到LoRA微调完整指南

1. 项目概述:为什么我们需要一个中文优化的Llama?最近在尝试将大语言模型应用到一些中文场景时,我遇到了一个典型问题:直接使用原版的Llama模型,在处理中文任务时,总感觉有点“水土不服”。无论是回答的流畅…...

【含五月最新安装包】OpenClaw v2.7.1 一键安装包|一键部署,告别复杂环境配置

OpenClaw 一键安装包|一键部署,告别复杂环境配置 ✨ 适配系统:Windows 10/11 64 位 当前版本:v2.7.1(虾壳云版) 核心优势:全程可视化操作,无需命令行、无需手动配置 Python/Node.js…...