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

相关推荐
mit6.824几秒前
C 语言仓库引入 Rust: MCUboot 为例
开发语言·rust
阿沁QWQ1 分钟前
STL和string实现
开发语言·c++
f***68602 分钟前
MS SQL Server partition by 函数实战二 编排考场人员
java·服务器·开发语言
前端一课2 分钟前
【vue高频面试题】第7题:Vue3 中 `v-model` 的工作原理是什么?为什么 Vue3 支持多个 v-model?如何在子组件中实现?
前端·面试
luguocaoyuan2 分钟前
前端沙箱隔离技术详解:从原理到实践
前端
前端一课3 分钟前
【vue高频面试题】第3题:Vue 3 中的 computed 是什么?和 watch 有什么区别?什么时候用哪一个?
前端·面试
vi121237 分钟前
ENVI 地形量化与植被指数反演
开发语言·python
Json____8 分钟前
vue2-数码购物商城-前端静态网站
前端·vue·数码商城
u***284710 分钟前
golang debug调试
开发语言·后端·golang
@大迁世界11 分钟前
03.CSS嵌套 (Nesting)
前端·css