中止 Web 请求新方式 - AbortController API

AbortController 是一个 JavaScript API,用于中止一个或多个 Web 请求。它最初是 Fetch API 的一部分,但现在已成为一个独立的接口,可以用于其他异步任务。

AbortController 是 Web 标准的一部分,由 WHATWG 制定,是现代浏览器原生支持的 API。

核心用途

AbortController 的主要作用是提供一种标准化的方式来取消正在进行的异步操作,比如:

  • 取消 fetch 请求

  • 中止 XMLHttpRequest

  • 停止其他异步任务

  • 清理事件监听器

**示例1:**基础使用

javascript 复制代码
const controller = new AbortController();

axios.get('https://api.example.com/data', {
  signal: controller.signal
})
  .then(response => console.log(response.data))
  .catch(error => {
    if (error.name === 'CanceledError') {
      console.log('请求已取消');
    } else {
      console.error('其他错误:', error);
    }
  });

// 取消请求
controller.abort();

**示例2:**多个相关请求的取消

javascript 复制代码
class DataFetcher {
  constructor() {
    this.mainController = null;
  }
  
  async fetchUserData(userId) {
    // 取消之前的用户数据请求
    if (this.mainController) {
      this.mainController.abort();
    }
    
    this.mainController = new AbortController();
    const signal = this.mainController.signal;
    
    try {
      // 并行发起多个相关请求
      const [user, posts, friends] = await Promise.all([
        this.fetchUser(userId, signal),
        this.fetchUserPosts(userId, signal),
        this.fetchUserFriends(userId, signal)
      ]);
      
      return { user, posts, friends };
    } catch (error) {
      if (error.name !== 'AbortError') {
        throw error;
      }
    }
  }
  
  async fetchUser(userId, signal) {
    const response = await fetch(`/api/users/${userId}`, { signal });
    return response.json();
  }
  
  async fetchUserPosts(userId, signal) {
    const response = await fetch(`/api/users/${userId}/posts`, { signal });
    return response.json();
  }
  
  async fetchUserFriends(userId, signal) {
    const response = await fetch(`/api/users/${userId}/friends`, { signal });
    return response.json();
  }
}

兼容性处理

javascript 复制代码
// 简单的 polyfill
if (typeof AbortController === 'undefined') {
  class AbortController {
    constructor() {
      this.signal = new AbortSignal();
    }
    abort() {
      this.signal.aborted = true;
      if (this.signal.onabort) {
        this.signal.onabort();
      }
    }
  }
  
  class AbortSignal {
    constructor() {
      this.aborted = false;
      this.onabort = null;
    }
  }
  
  window.AbortController = AbortController;
}

END.

相关推荐
克里斯蒂亚诺更新几秒前
ruoyi切换新版本初始化需要修改的地方
前端·javascript·vue.js
可视之道1 分钟前
基于Meta2d.js的电力系统组态平台实战开发
前端
特种加菲猫13 分钟前
二叉搜索树:数据世界的“快速寻路指南”
开发语言·c++
特种加菲猫19 分钟前
STL关联容器:Set/Multiset与Map/Multimap详解
开发语言·c++
小村儿23 分钟前
(译文)重温:Karpathy 的 4 条 CLAUDE.md 规则将 Claude 错误率从 41% 降至 11%——历经 30 个代码库后,我又加了 8 条
前端·后端·ai编程
我滴老baby24 分钟前
0基础速通Python+AI|2026热门轻量化玩法全攻略:从入门到实战,3天搞定AI应用开发
开发语言·人工智能·python
前端那点事25 分钟前
Vite+Vue3环境判断终极解法!区分开发/生产环境,告别环境报错
前端·vue.js
源码集结号27 分钟前
基于 Spring Boot + JPA + MySQL的上门家政系统代码示例
java·前端·后端
一个天蝎座 白勺 程序猿27 分钟前
Python(29)Python生成器函数深度解析:asyncio事件循环的底层实现与异步编程实战
开发语言·python
2zcode27 分钟前
原创文档:基于MATLAB的线性预测编码变声器系统
开发语言·matlab·语音识别