面试官:讲一下如何终止一个 Promise 继续执行

我们知道 Promise 一旦实例化之后,状态就只能由 Pending 转变为 Rejected 或者 Fulfilled, 本身是不可以取消已经实例化之后的 Promise 了。

但是我们可以通过一些其他的手段来实现终止 Promise 的继续执行来模拟 Promise 取消的效果。

Promise.race

我们都知道 Promise.race 方法接收多个 Promise ,一旦这些 Promise中任意一个 Promise 存在 resove 或者 reject 其他的 Promise 就不会执行了,基于这个特点,我们可以构造代码实现终止 Promise 的执行

从上面的输出可以看到此时第二个 promise resolve 的结果并没有输出,因此使用 Promise.race 还是可以达到终止一个 Promise 继续执行的目的。

Promise.race 只要有一个 promise 的状态发生了变化,不管是 resolve 还是 reject 都会忽略掉其他的 promise 的 resolve 还是 reject, 因此这也是上面控制台没有输出 第二个 promise 中 resolve 的值,但是却输出了 第二个 promise 中的 console.log

AbortController

通过 abortController.abort() 的方式实现终止Promise 的执行

封装一个新的 promise 去终止另一个 promise

测试代码:

执行结果:

  • 整个过程是声明一个新的 promise ,然后模拟的 异步操作 是 1000 ms 的时候resolve("hello") 这个新的 promise。

  • 但是我们在 500ms 的时候调用了取消函数, 并将这个新的 promise 直接 reject 掉了。导致 run 函数返回的 这个新的 promise 提前完成了状态切换,由 pending -> reject。

  • 由于这个新的 promise 状态提前结束了, 所以我们一开始传递的 promise(async 是 promise 的语法糖,内部也是一个 promise)就不会再执行了,因此达到一个终止的效果

第三方包 Bluebird

Bluebird作为一个基于 Promises/A+ 标准的社区的第三方库 Promise 库 , 比 async 还早出现,提供了很多原生标准没有的一些方法功能,例如这里的 cancel 取消promise 的功能,更多的细节或其他功能可以参考官网。

以下是 cancel promise 的代码示例:

小结

相信通过上面的介绍,你已经掌握了使用 如何在面试中回答终止一个 promise 这个面试题的的精髓了。

如果这篇文章对你有帮助,欢迎点赞、关注➕、转发 ✔ !

相关推荐
এ慕ོ冬℘゜1 小时前
如何在 HTML 中嵌入音频和视频?
前端·html·音视频
变与不变80610 小时前
jQuery怎么使用
前端·javascript
神膘护体小月半10 小时前
flex 布局的 order 属性
前端·css
paopaokaka_luck10 小时前
流浪动物救助与收养系统(DeepSeek AI对话、 ECharts多维分析、救助流程衔接、领养与回访衔接、 捐赠确认与公示、志愿者协作)
java·前端·javascript·人工智能·mysql·echarts·推荐算法
仰望.10 小时前
vue 表格组件 vxe-table 树表格懒加载支持拖拽排序的详细用法
前端·javascript·vue.js·vxe-table
前端 贾公子10 小时前
vite-plugin-uni-manifest 升级指南
前端
小码哥_常10 小时前
iPhone 用户传了张 HEIC,我的前端崩了
前端
小码哥_常10 小时前
你发的原图可能暴露你家地址——聊聊图片 EXIF 隐私
前端
java1234_小锋10 小时前
【技术专题】CSS3 网页技术 - CSS3 优先级
前端·css·css3
鸿蒙开发12 小时前
共享 Schema 与 SchemaFactory
前端·后端·harmonyos