首页 web前端 js教程 你真的了解AbortController吗?

你真的了解AbortController吗?

Jan 17, 2025 am 02:38 AM

你真的了解AbortController吗?

许多开发人员可能认为他们了解 AbortController,但它的功能远远超出了基础知识。从取消获取请求到管理事件监听器和 React hooks。

你真的知道AbortController有多强大吗?让我们看看:

使用 AbortController 取消获取请求

将 AbortController 与 fetch 结合使用,当然是最常见的用法。

以下示例演示了如何使用 AbortController 创建可取消的获取请求:

fetchButton.onclick = async () => {
  const controller = new AbortController();
  // Add a cancel button
  abortButton.onclick = () => controller.abort();
  try {
    const response = await fetch('/json', { signal: controller.signal });
    const data = await response.json();
    // Perform business logic here
  } catch (error) {
    const isUserAbort = error.name === 'AbortError';
    // AbortError is thrown when the request is canceled using AbortController
  }
};
登录后复制
登录后复制

上面的示例展示了在引入 AbortController 之前不可能实现的功能:以编程方式取消网络请求的能力。取消后,浏览器将停止获取,从而节省网络带宽。重要的是,取消不必由用户发起。

controller.signal 提供了一个 AbortSignal 对象,可以与 fetch 等异步操作进行通信,并允许取消它们。

要将多个信号合并为一个信号,可以使用 AbortSignal.any()。方法如下:

try {
  const controller = new AbortController();
  const timeoutSignal = AbortSignal.timeout(5000);
  const response = await fetch(url, {
    // Abort fetch if any of the signals are triggered
    signal: AbortSignal.any([controller.signal, timeoutSignal]),
  });
  const data = await response.json();
} catch (error) {
  if (error.name === 'AbortError') {
    // Notify the user of cancellation
  } else if (error.name === 'TimeoutError') {
    // Notify the user of timeout
  } else {
    // Handle other errors, like network issues
    console.error(`Type: ${error.name}, Message: ${error.message}`);
  }
}
登录后复制
登录后复制

AbortController 和 AbortSignal 之间的区别

  • AbortController:用于通过controller.abort()显式取消关联信号。
  • AbortSignal:代表信号对象;它不能直接取消任何内容,但会传达其中止状态。

对于 AbortSignal,您可以:

  • 使用signal.aborted检查是否中止。
  • 监听中止事件:
if (signal.aborted) {
}
signal.addEventListener('abort', () => {});
登录后复制
登录后复制

当使用 AbortController 取消请求时,服务器将不会处理该请求或发送响应,从而通过减少并发连接来节省带宽并提高客户端性能。

AbortController 的常见用例

取消 WebSocket 连接

WebSocket 等较旧的 API 本身并不支持 AbortSignal。相反,您可以像这样实现取消:

function abortableSocket(url, signal) {
  const socket = new WebSocket(url);
  if (signal.aborted) {
    socket.close();
    // Abort immediately if already canceled
  }
  signal.addEventListener('abort', () => socket.close());
  return socket;
}
登录后复制

注意:如果AbortSignal已经中止,则不会触发中止事件,因此需要提前检查并处理这种情况。

删除事件监听器

传统上,删除事件侦听器需要传递完全相同的函数引用:

window.addEventListener('resize', () => doSomething());
window.removeEventListener('resize', () => doSomething()); // This won’t work
登录后复制

使用 AbortController,这变得更容易:

const controller = new AbortController();
const { signal } = controller;
window.addEventListener('resize', () => doSomething(), { signal });
// Remove the event listener by calling abort()
controller.abort();
登录后复制

对于较旧的浏览器,请考虑添加一个polyfill来支持AbortController。

在 React Hook 中管理异步任务

在 React 中,如果组件在上一个异步任务完成之前更新,效果可能会无意中并行运行:

function FooComponent({ something }) {
  useEffect(async () => {
    const data = await fetch(url + something);
    // Handle the data
  }, [something]);
  return ...>;
}
登录后复制

为了避免此类问题,请使用 AbortController 取消之前的任务:

fetchButton.onclick = async () => {
  const controller = new AbortController();
  // Add a cancel button
  abortButton.onclick = () => controller.abort();
  try {
    const response = await fetch('/json', { signal: controller.signal });
    const data = await response.json();
    // Perform business logic here
  } catch (error) {
    const isUserAbort = error.name === 'AbortError';
    // AbortError is thrown when the request is canceled using AbortController
  }
};
登录后复制
登录后复制

在 Node.js 中使用 AbortController

现代 Node.js 包含与 AbortController 兼容的 setTimeout 实现:

try {
  const controller = new AbortController();
  const timeoutSignal = AbortSignal.timeout(5000);
  const response = await fetch(url, {
    // Abort fetch if any of the signals are triggered
    signal: AbortSignal.any([controller.signal, timeoutSignal]),
  });
  const data = await response.json();
} catch (error) {
  if (error.name === 'AbortError') {
    // Notify the user of cancellation
  } else if (error.name === 'TimeoutError') {
    // Notify the user of timeout
  } else {
    // Handle other errors, like network issues
    console.error(`Type: ${error.name}, Message: ${error.message}`);
  }
}
登录后复制
登录后复制

与浏览器 setTimeout 不同,此实现不接受回调;相反,使用 .then() 或 wait.

用于高级调度的任务控制器

浏览器正在转向使用 Scheduler.postTask() 来确定任务优先级,其中 TaskController 扩展了 AbortController。您可以使用它来取消任务并动态调整其优先级:

if (signal.aborted) {
}
signal.addEventListener('abort', () => {});
登录后复制
登录后复制

如果不需要优先级控制,可以直接使用AbortController来代替。

结论

AbortController 是现代 JavaScript 开发中的重要工具,提供了管理和取消异步任务的标准化方法。

它与浏览器和 Node.js 环境的集成凸显了它的多功能性和重要性。

如果您不了解 AbortController,现在是时候拥抱它的全部功能并使其成为异步编程工具包的基石了。


我们是 你真的了解AbortController吗?,是将 Node.js 项目部署到云端的首选。

你真的了解AbortController吗?

你真的了解AbortController吗? 是用于 Web 托管、异步任务和 Redis 的下一代无服务器平台:

多语言支持

  • 使用 Node.js、Python、Go 或 Rust 进行开发。

免费部署无限个项目

  • 只需支付使用费用——无请求,不收费。

无与伦比的成本效率

  • 即用即付,无闲置费用。
  • 示例:25 美元支持 694 万个请求,平均响应时间为 60 毫秒。

简化的开发者体验

  • 直观的用户界面,轻松设置。
  • 完全自动化的 CI/CD 管道和 GitOps 集成。
  • 实时指标和日志记录以获取可行的见解。

轻松的可扩展性和高性能

  • 自动扩展,轻松处理高并发。
  • 零运营开销 - 只需专注于构建。

在文档中探索更多内容!

Try 你真的了解AbortController吗?

在 X 上关注我们:@你真的了解AbortController吗?HQ


阅读我们的博客

以上是你真的了解AbortController吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

前端热敏纸小票打印遇到乱码问题怎么办? 前端热敏纸小票打印遇到乱码问题怎么办? Apr 04, 2025 pm 02:42 PM

前端热敏纸小票打印的常见问题与解决方案在前端开发中,小票打印是一个常见的需求。然而,很多开发者在实...

神秘的JavaScript:它的作用以及为什么重要 神秘的JavaScript:它的作用以及为什么重要 Apr 09, 2025 am 12:07 AM

JavaScript是现代Web开发的基石,它的主要功能包括事件驱动编程、动态内容生成和异步编程。1)事件驱动编程允许网页根据用户操作动态变化。2)动态内容生成使得页面内容可以根据条件调整。3)异步编程确保用户界面不被阻塞。JavaScript广泛应用于网页交互、单页面应用和服务器端开发,极大地提升了用户体验和跨平台开发的灵活性。

谁得到更多的Python或JavaScript? 谁得到更多的Python或JavaScript? Apr 04, 2025 am 12:09 AM

Python和JavaScript开发者的薪资没有绝对的高低,具体取决于技能和行业需求。1.Python在数据科学和机器学习领域可能薪资更高。2.JavaScript在前端和全栈开发中需求大,薪资也可观。3.影响因素包括经验、地理位置、公司规模和特定技能。

如何实现视差滚动和元素动画效果,像资生堂官网那样?
或者:
怎样才能像资生堂官网一样,实现页面滚动伴随的动画效果? 如何实现视差滚动和元素动画效果,像资生堂官网那样? 或者: 怎样才能像资生堂官网一样,实现页面滚动伴随的动画效果? Apr 04, 2025 pm 05:36 PM

实现视差滚动和元素动画效果的探讨本文将探讨如何实现类似资生堂官网(https://www.shiseido.co.jp/sb/wonderland/)中�...

JavaScript的演变:当前的趋势和未来前景 JavaScript的演变:当前的趋势和未来前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。

JavaScript难以学习吗? JavaScript难以学习吗? Apr 03, 2025 am 12:20 AM

学习JavaScript不难,但有挑战。1)理解基础概念如变量、数据类型、函数等。2)掌握异步编程,通过事件循环实现。3)使用DOM操作和Promise处理异步请求。4)避免常见错误,使用调试技巧。5)优化性能,遵循最佳实践。

如何使用JavaScript将具有相同ID的数组元素合并到一个对象中? 如何使用JavaScript将具有相同ID的数组元素合并到一个对象中? Apr 04, 2025 pm 05:09 PM

如何在JavaScript中将具有相同ID的数组元素合并到一个对象中?在处理数据时,我们常常会遇到需要将具有相同ID�...

Zustand异步操作:如何确保useStore获取的最新状态? Zustand异步操作:如何确保useStore获取的最新状态? Apr 04, 2025 pm 02:09 PM

zustand异步操作中的数据更新问题在使用zustand状态管理库时,经常会遇到异步操作导致数据更新不及时的问题。�...

See all articles