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

相关推荐
不会C语言的男孩几秒前
C++ Primer 第5章:语句
开发语言·c++
酉鬼女又兒4 分钟前
零基础入门计算机网络:从基本概念到核心交换技术
开发语言·计算机网络·考研·职场和发展·php
爱喝水的鱼丶6 分钟前
SAP-ABAP:SAP 简单报表输出开发系列(共6篇)第三篇:SAP ALV 报表样式定制:字段布局与交互功能配置
服务器·开发语言·学习·交互·sap·abap
chao1898446 分钟前
基于SIFT和SURF特征的图像配准(MATLAB)
开发语言·matlab
无风听海8 分钟前
Promise 与 Async Await 深度解析
前端·javascript
摇滚侠9 分钟前
JDBC 基础到高级一套通关!基础篇 00-15
java·开发语言·数据库
牛奶10 分钟前
AI 永远说好,于是我们只会说 yes
前端·aigc·ai编程
浩风祭月10 分钟前
把前端项目的 CI 构建时间从 15 分钟压到了 2 分钟
前端·ai编程
牛奶15 分钟前
黑客是怎么看到你数据的?
前端·安全·黑客
ihuyigui17 分钟前
国际企业办公短信接口
前端·后端·架构