当前位置: 首页 > news >正文

Web API:AbortController

Web API:AbortController

    • 主要用途
    • 基本工作原理
    • 基本用法示例
    • 高级用例
      • 1. 实现请求超时
      • 2. 取消多个请求
      • 3. 与其他异步 API 一起使用
    • 浏览器支持
    • 总结

主要用途

AbortController 是一个 Web API,主要用于取消一个或多个 Web 请求(如 fetch 请求)或终止其他异步操作。它提供了一种标准化的方式来中断正在进行的操作,特别是在以下情况下非常有用:

  1. 用户离开页面或切换视图时取消未完成的网络请求
  2. 实现超时机制
  3. 取消不再需要的长时间运行的操作
  4. 避免竞态条件(race conditions)

基本工作原理

AbortController 的工作原理基于以下组件:

  1. AbortController:控制器对象,用于创建中止信号并触发中止操作
  2. AbortSignal:表示中止状态的信号对象,可以传递给支持中止的 API

基本用法示例

// 创建一个 AbortController 实例
const controller = new AbortController();

// 获取与控制器关联的信号
const signal = controller.signal;

// 使用 fetch API 并传入信号
fetch('https://api.example.com/data', { signal })
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(err => {
    // 当请求被中止时,错误类型为 AbortError
    if (err.name === 'AbortError') {
      console.log('Fetch request was aborted');
    } else {
      console.error('Fetch error:', err);
    }
  });

// 在需要时中止请求
// 例如:用户点击取消按钮、设置超时等
controller.abort();

高级用例

1. 实现请求超时

function fetchWithTimeout(url, options = {}, timeout = 5000) {
  const controller = new AbortController();
  const { signal } = controller;
  
  // 设置超时
  const timeoutId = setTimeout(() => controller.abort(), timeout);
  
  return fetch(url, { ...options, signal })
    .then(response => {
      clearTimeout(timeoutId);
      return response;
    })
    .catch(err => {
      clearTimeout(timeoutId);
      throw err;
    });
}

// 使用
fetchWithTimeout('https://api.example.com/data', {}, 3000)
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(err => {
    if (err.name === 'AbortError') {
      console.log('Request timed out');
    } else {
      console.error(err);
    }
  });

2. 取消多个请求

const controller = new AbortController();
const { signal } = controller;

// 多个使用同一信号的请求
Promise.all([
  fetch('/api/data1', { signal }),
  fetch('/api/data2', { signal }),
  fetch('/api/data3', { signal })
])
.then(responses => Promise.all(responses.map(r => r.json())))
.then(dataArray => console.log(dataArray))
.catch(err => {
  if (err.name === 'AbortError') {
    console.log('All requests were aborted');
  }
});

// 一次调用可以取消所有请求
controller.abort();

3. 与其他异步 API 一起使用


// 与 DOM API 一起使用
const controller = new AbortController();
const { signal } = controller;

document.addEventListener('mousemove', event => {
  console.log(event.clientX, event.clientY);
}, { signal });

// 稍后取消事件监听
controller.abort();

浏览器支持

AbortController 在所有现代浏览器中得到广泛支持,包括:

  • Chrome 66+
  • Firefox 57+
  • Safari 12.1+
  • Edge 16+

对于不支持的浏览器,可以使用 polyfill。

总结

AbortController 是一个强大的 Web API,专门用于:

  • 取消进行中的网络请求
  • 停止不再需要的异步操作
  • 实现请求超时逻辑
  • 防止竞态条件
  • 在用户交互变化时优雅地处理资源清理

它提供了一种标准且优雅的方式来管理异步操作的生命周期,特别是在单页应用程序中,对于提高用户体验和资源利用效率非常重要。

相关文章:

  • 软件著作权代码整理(去掉注释和空行)
  • P1162 填涂颜色(BFS)
  • 【面试经典150题】LeetCode274·H指数
  • Qt进阶开发:模型/视图原理详解
  • 实战代码:esp32-cam按钮控制手机拍照V1.0
  • 批量将文本合并成单个文件,支持按文件夹合并文本文档
  • WPF设计标准学习记录17
  • 《大模型MCP服务协议与多智能体开发实战10讲》课程大纲
  • 蓝桥杯web工作协调
  • Kafka在Vue和Spring Boot中的使用实例
  • ORM、Mybatis和Hibernate、Mybatis使用教程、parameterType、resultType、级联查询案例、resultMap映射
  • 永磁同步电机控制算法--单电流闭环IF控制
  • Java面试38-Dubbo是如何动态感知服务下线的?
  • 国内虚拟电厂(VPP)管控平台供应商
  • 车载诊断架构 --- 特殊定义NRC处理原理
  • 基于PyQt5与OpenCV的图像处理系统设计与实现
  • 4月7日随笔
  • centos 8 启动Elasticsearch的时候报内存不足问题解决办法
  • 因果推断【Causal Inference】(一)
  • Springboot实现断点续传、分片下载
  • 分类信息网站建设方案/常州seo关键词排名
  • web网站建设遵循的原则/北京网站
  • 微网站不能分享朋友圈/张雷明任河南省委常委
  • 培训网站源码wordpress/百度云资源搜索引擎入口
  • 学设计哪个专业好/seo手机优化软件哪个好用
  • 电影网站开发技术/百度推广云南总代理