IT评测·应用市场-qidao123.com技术社区

标题: Web API:AbortController [打印本页]

作者: 羊蹓狼    时间: 2025-4-11 14:24
标题: Web API:AbortController
紧张用途

AbortController 是一个 Web API,紧张用于取消一个或多个 Web 请求(如 fetch 请求)或停止其他异步操纵。它提供了一种尺度化的方式来制止正在举行的操纵,特别是在以下情况下非常有效:
根本工作原理

AbortController 的工作原理基于以下组件:
根本用法示例

  1. // 创建一个 AbortController 实例
  2. const controller = new AbortController();
  3. // 获取与控制器关联的信号
  4. const signal = controller.signal;
  5. // 使用 fetch API 并传入信号
  6. fetch('https://api.example.com/data', { signal })
  7.   .then(response => response.json())
  8.   .then(data => console.log(data))
  9.   .catch(err => {
  10.     // 当请求被中止时,错误类型为 AbortError
  11.     if (err.name === 'AbortError') {
  12.       console.log('Fetch request was aborted');
  13.     } else {
  14.       console.error('Fetch error:', err);
  15.     }
  16.   });
  17. // 在需要时中止请求
  18. // 例如:用户点击取消按钮、设置超时等
  19. controller.abort();
复制代码
高级用例

1. 实现请求超时

  1. function fetchWithTimeout(url, options = {}, timeout = 5000) {
  2.   const controller = new AbortController();
  3.   const { signal } = controller;
  4.   
  5.   // 设置超时
  6.   const timeoutId = setTimeout(() => controller.abort(), timeout);
  7.   
  8.   return fetch(url, { ...options, signal })
  9.     .then(response => {
  10.       clearTimeout(timeoutId);
  11.       return response;
  12.     })
  13.     .catch(err => {
  14.       clearTimeout(timeoutId);
  15.       throw err;
  16.     });
  17. }
  18. // 使用
  19. fetchWithTimeout('https://api.example.com/data', {}, 3000)
  20.   .then(response => response.json())
  21.   .then(data => console.log(data))
  22.   .catch(err => {
  23.     if (err.name === 'AbortError') {
  24.       console.log('Request timed out');
  25.     } else {
  26.       console.error(err);
  27.     }
  28.   });
复制代码
2. 取消多个请求

  1. const controller = new AbortController();
  2. const { signal } = controller;
  3. // 多个使用同一信号的请求
  4. Promise.all([
  5.   fetch('/api/data1', { signal }),
  6.   fetch('/api/data2', { signal }),
  7.   fetch('/api/data3', { signal })
  8. ])
  9. .then(responses => Promise.all(responses.map(r => r.json())))
  10. .then(dataArray => console.log(dataArray))
  11. .catch(err => {
  12.   if (err.name === 'AbortError') {
  13.     console.log('All requests were aborted');
  14.   }
  15. });
  16. // 一次调用可以取消所有请求
  17. controller.abort();
复制代码
3. 与其他异步 API 一起使用

  1. // 与 DOM API 一起使用
  2. const controller = new AbortController();
  3. const { signal } = controller;
  4. document.addEventListener('mousemove', event => {
  5.   console.log(event.clientX, event.clientY);
  6. }, { signal });
  7. // 稍后取消事件监听
  8. controller.abort();
复制代码
浏览器支持

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

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

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

它提供了一种尺度且优雅的方式来管理异步操纵的生命周期,特别是在单页应用步伐中,对于进步用户体验和资源利用效率非常紧张。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4