JS中AbortController中止请求操作的实现示例

 更新时间:2026年02月24日 09:18:54   作者:发现一只大呆瓜  
AbortController是JavaScript中的一个信号控制对象,用于实现异步操作的可控制和可中止,本文主要介绍了JS中AbortController中止请求操作的实现示例,感兴趣的可以了解一下

前言

在前端开发中,我们经常遇到需要中途撤回请求的情况(例如:搜索框快速输入、大型文件上传取消、或是 AI 聊天流的即时中断)。传统的 Promise 一旦启动就无法在外部“叫停”,而 AbortController 的出现,完美填补了这一空白。

一、 核心概念与原理

AbortController 是 JavaScript 内置的信号控制对象,它是实现异步操作可控制、可中止的核心。

1. 关键组成部分

  • controller.signal:一个 AbortSignal 对象实例。它充当“监听器”,将其传递给异步操作后,该操作会持续观察信号状态。
  • controller.abort() :触发中止的方法。调用后,signal 上的 abort 事件会被触发,同时将 signal.aborted 设为 true。

二、 基础使用模式

1. 实现步骤

  1. 使用 new AbortController() 生成实例。
  2. 将实例中的 signal 属性传递给需要支持中止的异步 API(如 fetch)。
  3. 在合适的时机调用 controller.abort() 即可主动终止。

2. 代码示例

// 1. 创建 AbortController 实例
const controller = new AbortController();
const { signal } = controller;

// 2. 发起请求并绑定信号
fetch("/api/data", { signal })
  .then((response) => response.json())
  .then((data) => console.log("请求成功:", data))
  .catch((err) => {
    // 3. 捕获中止错误
    if (err.name === "AbortError") {
      console.log("主动取消:请求被成功截断");
    } else {
      console.error("请求失败:", err);
    }
  });

// 2 秒后主动取消请求
setTimeout(() => {
  controller.abort(); 
}, 2000);

三、 进阶技巧与场景

1. 批量取消请求

如果想同时取消多个相关的请求,可以给这些请求共享同一个 signal。当调用 abort() 时,所有关联的任务都会收到中止信号。

2. 示例

// 使用同一个 AbortController 取消多个请求
const controller = new AbortController();

// 请求1
const request1 = fetch('url1', {
  signal: controller.signal
});

// 请求2
const request2 = fetch('url2', {
  signal: controller.signal
});

// 请求3
const request3 = fetch('url3', {
  signal: controller.signal
});

// 同时取消所有请求
document.getElementById('cancelBtn').addEventListener('click', () => {
  controller.abort();
  console.log('所有请求已取消');
});

// 等待所有请求
Promise.all([request1, request2, request3])
  .then(responses => Promise.all(responses.map(r => r.json())))
  .then(data => console.log('所有数据:', data))
  .catch(error => {
    if (error.name === 'AbortError') {
      console.log('请求被取消');
    }
  });

3. 注意事项

  • 兼容性:并非所有 API 都原生支持。目前 fetch、Axios (v0.22+) 模块已提供支持。
  • 幂等性:abort() 方法只能生效一次。多次调用虽然不会报错,但只有第一次调用会触发中止逻辑。

四、 总结对比

特性传统 Promise带有 AbortController 的 Promise
可控性开启后无法干预可随时通过 abort() 中止
异常处理只有成功/失败增加 AbortError 类型,方便区分主动取消与网络异常
应用场景简单的数据获取复杂交互、流式输出、性能调优

到此这篇关于JS中AbortController中止请求操作的实现示例的文章就介绍到这了,更多相关JS AbortController中止请求操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • js实现字符串的16进制编码不加密

    js实现字符串的16进制编码不加密

    关于十六进制编码的问题在很多情况下都会用到,所以使用JS写了个小程序转换一下
    2014-04-04
  • JavaScript实现验证码案例

    JavaScript实现验证码案例

    这篇文章主要为大家详细介绍了JavaScript实现验证码案例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • bootstrap-table+treegrid实现树形表格

    bootstrap-table+treegrid实现树形表格

    这篇文章主要为大家详细介绍了bootstrap-table+treegrid实现树形表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • VScode中配置JavaScript编译环境的方法

    VScode中配置JavaScript编译环境的方法

    这篇文章主要介绍了VSCODE中配置JavaScript编译环境的方法,方式一 使用Node.js做为解释器运行JS代码 Node.js的安装和配置,方式二使用VSCODE插件Code Runner运行JS代码,本文给大家介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • js千分位实现方法大汇总

    js千分位实现方法大汇总

    这篇文章主要介绍了js千分位实现方法大汇总,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • exif.js获取图片原始信息的实现

    exif.js获取图片原始信息的实现

    exif-js 是一个JavaScript库,用于读取图片的EXIF信息,本文就来介绍一下exif.js获取图片原始信息的实现,感兴趣的可以了解一下
    2025-05-05
  • 浅谈JavaScript find 方法不支持IE的问题

    浅谈JavaScript find 方法不支持IE的问题

    下面小编就为大家带来一篇浅谈JavaScript find 方法不支持IE的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • onkeypress字符按键兼容所有浏览器使用介绍

    onkeypress字符按键兼容所有浏览器使用介绍

    使用onkeypress字符按键兼容所有浏览器,感兴趣的朋友可以参考下,希望对你学习js事件有所帮助
    2013-04-04
  • js阻止默认浏览器行为与冒泡行为的实现代码

    js阻止默认浏览器行为与冒泡行为的实现代码

    下面小编就为大家带来一篇js阻止默认浏览器行为与冒泡行为的实现代码。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • B/S(Web)实时通讯解决方案分享

    B/S(Web)实时通讯解决方案分享

    这篇文章主要为大家分享了B/S(Web)实时通讯的解决方案,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04

最新评论