文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Promise.allSettled的作用是什么

2024-04-02 19:55

关注

本篇内容介绍了“Promise.allSettled的作用是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

引言

本文从四个方面循序渐进介绍 Promise.allSettled :

下面正文开始??

Promise.all() 的缺陷

我们在之前的一篇文章中 面试官问:Promise.all 使用、原理实现及错误处理 已经介绍过,当我们使用 Promise.all() 执行过个  promise 时,只要其中任何一个promise 失败都会执行 reject ,并且 reject 的是第一个抛出的错误信息,只有所有的 promise 都  resolve 时才会调用 .then 中的成功回调

const p1 = Promise.resolve(1) const p2 = Promise.resolve(2) const p3 = new Promise((resolve, reject) => {   setTimeout(reject, 1000, 'three'); });  Promise.all([p1, p2, p3]) .then(values => {     console.log('resolve: ', values) }).catch(err => {     console.log('reject: ', err) })   // reject:  three

注意:其中任意一个 promise 被 reject ,Promise.all 就会立即被 reject ,数组中其它未执行完的 promise  依然是在执行的, Promise.all 没有采取任何措施来取消它们的执行

但大多数场景中,我们期望传入的这组 promise 无论执行失败或成功,都能获取每个 promise 的执行结果,为此,ES2020 引入了  Promise.allSettled()

Promise.allSettled()

Promise.allSettled() 可以获取数组中每个 promise 的结果,无论成功或失败

const p1 = Promise.resolve(1) const p2 = Promise.resolve(2) const p3 = new Promise((resolve, reject) => {   setTimeout(reject, 1000, 'three'); });  Promise.allSettled([p1, p2, p3]) .then(values => {     console.log(values) })   

当浏览器不支持 Promise.allSettled ,可以如此 polyfill:

if (!Promise.allSettled) {   const rejectHandler = reason => ({status: "rejected", reason})   const resolveHandler = value => ({status: "fulfilled", value})   Promise.allSettled = promises =>     Promise.all(       promises.map((promise) =>         Promise.resolve(promise)            .then(resolveHandler, rejectHandler)       )       // 每个 promise 需要用 Promise.resolve 包裹下       // 以防传递非 promise     ); }  // 使用 const p1 = Promise.resolve(1) const p2 = Promise.resolve(2) const p3 = new Promise((resolve, reject) => {   setTimeout(reject, 1000, 'three'); }) const promises = [p1, p2, p3] Promise.allSettled(promises).then(console.log)

Promise.allSettled的作用是什么

Promise.allSettled() 与 Promise.all() 各自的适用场景

Promise.allSettled() 更适合:

Promise.all() 更适合:

手写 Promise.allSettled 源码

与 Promise.all 不同的是,当 promise 被 reject 之后,我们不会直接 reject ,而是记录下该 reject  的值和对应的状态 'rejected' ;

同样地,当 promise 对象被 resolve 时我们也不仅仅局限于记录值,同时也会记录状态 'fulfilled' 。

当所有的 promise 对象都已执行(解决或拒绝),我们统一 resolve 所有的 promise 执行结果数组

MyPromise.allSettled = function (promises) {     return new MyPromise((resolve, reject) => {       promises = Array.isArray(promises) ? promises : []       let len = promises.length       const argslen = len       // 如果传入的是一个空数组,那么就直接返回一个resolved的空数组promise对象       if (len === 0) return resolve([])       // 将传入的参数转化为数组,赋给args变量       let args = Array.prototype.slice.call(promises)       // 计算当前是否所有的 promise 执行完成,执行完毕则resolve       const compute = () => {         if(--len === 0) {            resolve(args)         }       }       function resolvePromise(index, value) {         // 判断传入的是否是 promise 类型         if(value instanceof MyPromise) {            const then = value.then           then.call(value, function(val) {             args[index] = { status: 'fulfilled', value: val}             compute()           }, function(e) {             args[index] = { status: 'rejected', reason: e }             compute()           })         } else {           args[index] = { status: 'fulfilled', value: value}           compute()         }       }           for(let i = 0; i < argslen; i++){         resolvePromise(i, args[i])       }     })   }

总结

彼此相互依赖,一个失败全部失效(全无或全有)用 Promise.all ;相互独立,获取每个结果用 Promise.allSettled

“Promise.allSettled的作用是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯