新闻中心

优雅地结合 Async/Await 与可取消的 Bluebird Promise

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

优雅地结合 async/await 与可取消的 bluebird promise

本文旨在解决在使用 Bluebird Promise 实现可取消的异步操作时,async/await 导致的程序卡死问题。我们将探讨如何利用 ES6 内置的 AbortController 来实现 Promise 的取消,并确保程序在取消后能够正常执行后续流程,避免代码阻塞。通过示例代码,我们将展示如何将 AbortController 集成到你的异步函数中,并正确处理取消事件,从而构建更加健壮和可控的异步代码。

在使用 Bluebird 的可取消 Promise 时,结合 async/await 可能会遇到一些问题,尤其是在 Promise 被取消的情况下,程序可能会卡在 await 语句处,导致后续代码无法执行。 这主要是因为取消操作没有正确地通知 await 表达式,使得它一直等待 Promise 的 resolve 或 reject。

解决这个问题的关键在于使用 ES6 内置的 AbortController。AbortController 提供了一种标准的方式来取消异步操作,并且可以与 Promise 结合使用。

使用 AbortController 取消 Promise

以下是一个使用 AbortController 实现可取消 Promise 的示例:

青泥AI 青泥AI

青泥学术AI写作辅助平台

青泥AI 360 查看详情 青泥AI
let myP = (signal) =>
  new Promise((resolve, reject) => {
    const tm = setTimeout(function () {
      console.log("before resolve");
      resolve("Success!"); // Yay! Everything went well!
    }, 2500);

    // signal.onabort = () => { // 旧写法,不推荐
    signal.addEventListener('abort', () => {
      console.log('aborted');
      clearTimeout(tm);
      reject(new Error('Promise Aborted')); // 建议 reject,方便错误处理
      // resolve(); // 也可以 resolve,取决于业务需求
    });
  });

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

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

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

  try {
    await prm;
    console.log("After await prm");
  } catch (e) {
    console.error("Caught error:", e);
  } finally {
    console.log("Finished");
  }
};

run();

代码解释:

  1. AbortController 的创建: 首先,我们创建一个 AbortController 实例。
  2. signal 的传递: 将 AbortController 的 signal 传递给 myP 函数。signal 对象用于监听取消事件。
  3. addEventListener('abort', ...): 在 myP 函数内部,我们使用 signal.addEventListener('abort', ...) 监听 abort 事件。 当 AbortController 调用 abort() 方法时,该事件会被触发。
  4. 取消处理: 在 abort 事件处理函数中,我们执行取消操作,包括清除定时器 clearTimeout(tm),并调用 reject(new Error('Promise Aborted')) 来拒绝 Promise。 也可以根据业务需求选择 resolve()。 建议使用 reject,因为这样可以在 catch 块中处理取消错误。
  5. controller.abort() 的调用: 在 run 函数中,我们使用 setTimeout 在 1 秒后调用 controller.abort(),模拟取消操作。
  6. 错误处理: 使用 try...catch 块来捕获可能发生的错误,包括取消导致的错误。

注意事项:

  • reject vs resolve: 当 Promise 被取消时,应该选择 reject 还是 resolve 取决于你的业务逻辑。 如果取消被视为一种错误情况,则应该 reject Promise。 如果取消只是中断了操作,并且不需要进一步处理,则可以 resolve Promise。
  • 资源清理: 在 abort 事件处理函数中,务必清理所有已分配的资源,例如定时器、网络连接等,以避免内存泄漏。
  • signal.onabort vs signal.addEventListener('abort', ...): 建议使用 addEventListener,因为它允许你注册多个取消处理函数。 避免使用 signal.onabort = ...,因为它只能注册一个处理函数。
  • 多个 Promise 的取消: 可以使用同一个 AbortController 的 signal 来取消多个 Promise。 这在需要同时取消多个相关操作时非常有用。

总结

AbortController 提供了一种简洁而强大的方式来取消异步操作,并且可以与 async/await 和 Promise 无缝集成。 通过使用 AbortController,你可以构建更加健壮和可控的异步代码,避免程序卡死,并有效地管理资源。 记得在取消处理函数中清理资源并根据业务需求选择 reject 或 resolve Promise。

以上就是优雅地结合 Async/Await 与可取消的 Bluebird Promise的详细内容,更多请关注其它相关文章!


# ai  # 金山区营销推广方案设计  # 太谷网站建设哪家好  # seo网站页面优化  # 网站阶段推广目标  # 福州抖音seo案例  # 娄底网站建设策划书范文  # 附近建设银行网站  # 光明专业网站建设  # 专利推广网站有哪些  # 是在  # 有何不同  # 是一个  # 新特性  # 如何实现  # 因为它  # 带来了  # 可取消  # 递归  # 多个  # es6  # 平顶山关键词排名靠前 


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


相关推荐: C#中解析不规范的HTML为XML 常见的坑与解决办法  c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧  铁路12306官网网页端快速入口 铁路12306官方首页登录教程  优酷会员付费后没到账怎么办_优酷会员充值异常及解决方法  Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践  Linux如何排查内存不足OOME问题_LinuxOOM分析教程  uc手机浏览器网页版入口 uc浏览器手机版便捷登录首页  Lar*el表单中优雅地处理“返回”按钮以规避验证:最佳实践指南  poki网页游戏推荐_poki免费游戏平台入口  一加Ace 6T实拍样张首次公布!李杰:主摄实力完全看齐4K档性能旗舰  知音漫客正版漫画平台_知音漫客官网账号登录  PySpark中从现有列右侧提取可变长度字符创建新列的教程  CSS响应式网页如何实现主次模块比例自适应_flex-grow与flex-shrink调整  J*aScript数据结构转换:将对象数组按类别分组  顺丰快件物流信息 官方网站查询入口  如何高效处理PHP中的Excel数据导入导出?PortPHP/Spreadsheet助你轻松搞定!  在J*a中如何在J*a中使用异常机制记录错误日志_异常日志实践经验  Win11怎么隐藏桌面图标 Win11一键隐藏所有桌面元素及恢复显示  微信网页版登录教程_微信网页版登录入口在哪  J*a里如何实现线程安全的懒加载单例_懒加载单例实现方法解析  Win11输入法不见了怎么办_Windows11恢复语言栏显示方法  PHP高效扁平化嵌套数组:使用array_merge与数组解包操作符  CSS布局:解决全屏元素100%尺寸与外边距导致的页面溢出问题  PHP中SSG-WSG API的AES加密实践:正确使用初始化向量  精准捕获:如何在页面中监听除特定元素外的所有点击事件  Kafka Streams中基于消息头条件过滤消息的实现指南  PHP URL参数传递与500错误调试指南  yy漫画网页版官方入口_yy漫画官网登录页面链接  NetBeans Ant项目:自动化将资源文件复制到dist目录的教程  蓝湖怎样用切图标注提对接效率_蓝湖用切图标注提对接效率【设计对接】  163邮箱官方主页登录 直达网易邮箱登录核心页面  网站内容防复制粘贴的实现策略与局限性  Pandas DataFrame:高效添加条件计算列  KFC早餐时段怎么领特惠代码_KFC早餐订餐优惠代码获取与使用说明  HTML转PPT成品工具有哪些?HTML网页转PPT成品工具大全  CSS Flexbox如何实现多行排列_flex-wrap wrap自动换行显示  谷歌浏览器最新官方入口链接 谷歌浏览器网页版官网导航  Python多版本共存与虚拟环境管理深度指南  抖音网页版平台入口 抖音网页版官网在线访问教程  抖音隐秘迷城小游戏入口_ 抖音冒险解谜小游戏秒玩  腾讯QQ邮箱官方网站_QQ邮箱网页版在线登录  Lar*el递归关系中排除子孙节点的策略  黑猫投诉统一入口官网 消费者权益保护投诉平台  小米14应用无法联网原因分析_小米14网络权限修复  苹果手机指南针不准怎么校准 传感器校准方法详解【建议收藏】  C++如何使用AddressSanitizer(ASan)_C++调试工具中检测内存访问错误的利器  大麦的“候补”是什么意思 大麦候补购票规则【详解】  4399免费游戏网址入口 4399小游戏免费入口点开即玩  MinIO大规模对象列表性能瓶颈深度解析与外部元数据管理策略  Excel中VLOOKUP的第四个参数是干什么用的_Excel VLOOKUP第四参数作用解析 

搜索