新闻中心

使用 AbortController 实现可取消的 Async/Await 操作

2025-10-08
浏览次数:
返回列表

使用 abortcontroller 实现可取消的 async/await 操作

在现代 J*aScript 开发中,async/await 已经成为处理异步操作的标准方式。然而,在某些场景下,我们需要能够取消正在进行的异步操作,例如用户主动取消请求、组件卸载等。虽然 Bluebird 提供了可取消的 Promise,但 ES6 内置的 AbortController 提供了一种更简洁、更通用的解决方案。

AbortController 的核心思想是创建一个信号 (signal),将其传递给异步操作,并在需要取消时触发该信号。异步操作监听该信号,并在接收到取消信号时执行相应的清理工作。

使用 AbortController 的步骤:

  1. 创建 AbortController 实例:

    const controller = new AbortController();
    const signal = controller.signal;

    AbortController 负责管理取消信号。controller.signal 返回一个 AbortSignal 对象,该对象可以传递给异步操作。

  2. 将 AbortSignal 传递给异步操作:

    let myP = (sig) =>
      new Promise((resolve, reject) => {
        const tm = setTimeout(function () {
          console.log("before resolve");
          resolve("Success!"); // Yay! Everything went well!
        }, 2500);
        //sig.onabort = () => {
        sig.addEventListener('abort', () => {
          console.log('aborted');
          clearTimeout(tm);
          resolve(); // Or reject, depending on your logic
        });
      });

    异步操作(这里是一个 Promise)通过 addEventListener('abort', callback) 监听 AbortSignal 的 abort 事件。当 abort 事件触发时,回调函数会被执行,可以在其中执行清理工作,例如取消定时器、关闭连接等。

    注意: 在取消操作中,务必调用 resolve() 或 reject() 来结束 Promise,否则 async/await 会一直阻塞。通常情况下,建议调用 reject(),并传递一个错误信息,以便更好地处理取消事件。

    青泥AI 青泥AI

    青泥学术AI写作辅助平台

    青泥AI 360 查看详情 青泥AI
  3. 触发取消信号:

    setTimeout(() => controller.abort(), 1000);

    当需要取消异步操作时,调用 controller.abort() 方法。这将触发 AbortSignal 的 abort 事件,并执行所有注册的回调函数。

完整示例:

let myP = (sig) =>
  new Promise((resolve, reject) => {
    const tm = setTimeout(function () {
      console.log("before resolve");
      resolve("Success!"); // Yay! Everything went well!
    }, 2500);
    //sig.onabort = () => {
    sig.addEventListener('abort', () => {
      console.log('aborted');
      clearTimeout(tm);
      resolve(); // Or reject, depending on your logic
    });
  });

const run = async () => {
  console.log("Start");

  const controller = new AbortController();
  const prm = myP(controller.signal);
  setTimeout(() => controller.abort(), 1000);

  await prm;
  console.log("After await prm");
};

run()
  .then(() => console.log("Finished"))
  .catch((e) => console.error(e));

注意事项:

  • AbortController 只能取消已经开始的异步操作。如果异步操作尚未开始,则无法取消。
  • 在 abort 事件回调函数中,务必执行必要的清理工作,以避免资源泄漏。
  • 可以使用同一个 AbortSignal 取消多个异步操作。这在需要同时取消多个相关操作时非常有用。
  • AbortController 不仅可以用于 fetch API,还可以用于任何支持 AbortSignal 的异步操作。

总结:

AbortController 提供了一种简单而强大的机制,用于取消 async/await 中的异步操作。通过创建、传递和触发取消信号,可以有效地管理异步流程,提高程序的健壮性和用户体验。在需要取消异步操作的场景下,AbortController 是一个值得考虑的选择。

以上就是使用 AbortController 实现可取消的 Async/Await 操作的详细内容,更多请关注其它相关文章!


# 如何用  # 太原小红书推广营销  # 浙江义乌网站建设网站  # 赣州seo公司到1火星  # 坡头区网站建设方案公示  # 喀什seo网站  # 张家界百度网站优化  # 网站优化公司商集客电话  # 成功的seo流动  # 自建网站推广的形式  # 网站关键词优化方法策略  # 有哪些  # 如何实现  # javascript  # 如何使用  # 并在  # 可取消  # 多个  # 是一个  # 可以使用  # 回调  # ai  # 回调函数  # java  # es6 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: HuggingFaceEmbeddings中向量嵌入维度调整的限制与理解  一加手机拍照效果不好怎么办 一加哈苏影像调校与专业模式使用教程【高手篇】  聚水潭ERP登录页面入口 聚水潭ERP官网登录界面  NetBeans Ant项目:自动化将资源文件复制到dist目录的教程  C++20的source_location是什么_C++在编译期获取源码位置信息用于日志和断言  俄罗斯Yandex免登录入口_Yandex搜索引擎官网一键直达  Lar*el用户头像管理:实现图片缩放、存储与旧文件安全删除的最佳实践  12306怎么选座位选到安静区_12306选座安静区域选择策略  蛙漫官方正版入口 蛙漫网页在线全集免费观看  使用 Pandas 高效处理 .dat 文件:字符清理与数据计算  LINQ to XML为何解析失败? 深入理解C# XDocument的异常处理  在J*a里如何理解依赖关系的方向_依赖方向在模块结构中的作用  三星ZFold5多任务卡顿_Samsung ZFold5流畅度提升  动漫共和国防屏蔽稳定域名-动漫共和国官方正版直达通道  c++如何使用std::memory_order控制原子操作顺序_c++ C++11内存模型详解  Windows10怎么开启存储感知 Windows10系统设置自动清理临时文件释放C盘空间【教程】  谷歌邮箱注册显示错误Gmail服务器异常与延迟处理  解决Python单元测试中Mock异常方法调用计数为零的问题  Go语言中对Map值调用带指针接收者方法:原理与最佳实践  J*a里如何实现线程安全的懒加载单例_懒加载单例实现方法解析  Shopware订单对象中获取产品自定义字段的正确方法  C++如何检测键盘输入_C++ _kbhit与_getch函数非阻塞输入  厨房不锈钢水槽发黑生锈怎么处理_水槽用可乐+锡纸2分钟抛亮如新  mysql通配符支持数字匹配吗_mysql通配符能否用于数字匹配的解析  正确连接J*aScript到HTML实现可点击图片与自定义事件处理  抖音网页版平台入口 抖音网页版官网在线访问教程  我的世界mc.js免费游戏直接能玩 我的世界mc.js小游戏免费秒玩入口  CSS子选择器:如何区分并样式化嵌套列表的子层级  如何创建没有密码的Windows本地账户_跳过微软账户登录的技巧【教程】  vivo手机参数配置怎么增强信号_vivo手机参数配置信号增强方法  在python-socketio事件处理器中安全访问Flask应用上下文  steam官方入口大全 steam账号注册及操作指南  Go语言中JSON数据解码与字段访问指南  AWS EC2实例间SQL Server连接超时:安全组配置与故障排除指南  在J*a项目里如何构建对象之间的契约_接口约束的实际落地  必由学官网快捷入口 必由学网页版在线学习平台  Win11怎么开启卓越性能模式 Win11电源选项启用高性能释放硬件潜力【方法】  随机参数递归函数的基准调用次数与时间复杂度探究  CSS Box Model与弹性按钮:维持布局稳定的动画实践  在J*a中如何开发在线活动报名与管理系统_活动报名管理项目实战解析  Tabulator表格日期时间排序问题及自定义解决方案  Vue.js 图片显示异常排查:理解应用挂载范围与DOM ID唯一性  J*a中实现Go语言select通道多路复用机制  Golang如何实现容器化日志收集与分析_Golang容器日志收集分析方法  C++ explicit关键字防止隐式转换_C++构造函数安全规范  163邮箱注册官网 免费申请163个人邮箱  Safari怎么安装扩展程序 浏览器插件安装与管理方法【详解】  Django模型中自动计算可用余额的实现方法  J*aScript Promise链中如何正确终止后续.then执行并处理错误  顺丰快递查单号物流信息 顺丰快递小程序查询入口 

搜索