abortcontroller 是遥控器,abortsignal 是收音机:调用 abort() 即广播“停止”,所有监听该 signal 的异步操作(如 fetch)立即退出并抛出 aborterror;该机制基于 eventtarget,不可逆、幂等、跨 api 统一。

可以把它想象成“遥控器+收音机”的关系:AbortController 是遥控器,AbortSignal 是收音机——你按遥控器的“关”键(abort()),所有连着这个收音机的请求(比如 fetch、axios、setTimeout)立刻静音停播。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
信号不是命令,而是“广播通知”
AbortSignal 本身不干任何事,它只是个“消息广播站”。当你把 signal 传给 fetch:
fetch(url, { signal })
相当于告诉 fetch:“你去听这个广播站。一旦它喊‘停’,你就别再等了,直接报错。”
而 controller.abort() 就是按下广播站的“紧急中断按钮”,所有正在监听它的操作都会在同一时刻收到通知。
为什么不能“恢复”?因为取消是单向动作
就像按下电梯的“开门”键后不能反向“关门”来撤销开门——abort() 的设计就是不可逆的:
• 调一次或多次,效果一样:信号状态变成 aborted = true,之后再调没反应(幂等);
• 一旦触发,事件 abort 同步发出,监听者立刻响应,不排队、不延迟;
• 它不杀线程、不关连接,只是让上层逻辑主动退出等待,避免浪费 CPU 和内存。
底层靠 EventTarget 实现跨操作统一
AbortSignal 继承自 EventTarget(和 button.onclick 用的是同一套机制),所以:
• fetch、XHR、甚至 Node.js 的 fs.readFile 都能“订阅”同一个 signal;
• 一个 controller 可以控制多个请求(比如同时取消搜索 + 用户信息 + 配置加载);
• 业务不用关心各 API 怎么取消,只管“发信号”,各 API 自己实现监听和退出逻辑。
错误不是失败,而是“被叫停”
catch 到的 AbortError 不代表网络坏了或服务器挂了,它只是告诉你:
• “这个请求本来可以成功,但你主动让它停了”;
• 所以业务层通常忽略它(比如组件卸载时取消请求,就不需要弹错误提示);
• 真正要处理的,是用户操作引发的取消场景,比如防重复提交、页面跳转、输入联想中途换词。










