中止 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.

相关推荐
用泥种荷花12 分钟前
【LangChain.js学习】 RAG(检索增强生成)完整实现解析
前端
willow27 分钟前
Generator与Iterator
javascript
兔子零102432 分钟前
Star-Office-UI-Node 实战:从 0 到 1 接入 OpenClaw 的多 Agent 看板
前端·ai编程
helloweilei32 分钟前
一文搞懂Nextjs中的Proxy
前端·next.js
wuhen_n1 小时前
Pinia状态管理原理:从响应式核心到源码实现
前端·javascript·vue.js
陆枫Larry1 小时前
小程序 scroll-view 设置 padding 右侧不生效?用一层包裹解决
前端
晴殇i1 小时前
CommonJS 与 ES6 模块引入的区别详解
前端·javascript·面试
Selicens1 小时前
git批量删除本地多余分支
前端·git·后端
wuhen_n2 小时前
KeepAlive:组件缓存实现深度解析
前端·javascript·vue.js
前端付豪2 小时前
Nest 项目小实践之图书展示和搜索
前端·node.js·nestjs