关于javascript:Promiseall和PromiseallSettled的区别

不论你是否还学的动,JS语言仍然在以本人的节奏飞快的进化。转眼间,Promise的工具包里又多了一个办法Promise.allSettled供你抉择,它看起来像是对Promise.all的一种补充,缓解了应用Promise.all碰到reject的痛点问题。

一句话概括Promise.allSettled和Promise.all的最大不同:Promise.allSettled永远不会被reject

解决Promise.all的痛点

当须要解决多个Promise并行时,大多数状况下Promise.all用起来是十分棘手的,比方上面这样

const delay = n => new Promise(resolve => setTimeout(resolve, n));

const promises = [
  delay(100).then(() => 1),
  delay(200).then(() => 2),
  ]

Promise.all(promises).then(values=>console.log(values))
// 最终输入: [1, 2]

可是,是一旦有一个promise呈现了异样,被reject了,状况就会变的麻烦。

const promises = [
  delay(100).then(() => 1),
  delay(200).then(() => 2),
  Promise.reject(3)
  ]

Promise.all(promises).then(values=>console.log(values))
// 最终输入: Uncaught (in promise) 3

Promise.all(promises)
.then(values=>console.log(values))
.catch(err=>console.log(err))
// 退出catch语句后,最终输入:3

只管能用catch捕捉其中的异样,但你会发现其余执行胜利的Promise的音讯都失落了,好像杳无音信个别。

要么全副胜利,要么全部重来,这是Promise.all自身的强硬逻辑,也是痛点的起源,不能说它错,但这确实给Promise.allSettled留下了立足的空间。

如果应用Promise.allSettled来解决这段逻辑会怎么呢?

const promises = [
  delay(100).then(() => 1),
  delay(200).then(() => 2),
  Promise.reject(3)
  ]

Promise.allSettled(promises).then(values=>console.log(values))
// 最终输入: 
//    [
//      {status: "fulfilled", value: 1},
//      {status: "fulfilled", value: 2},
//      {status: "rejected", value: 3},
//    ]

能够看到所有promise的数据都被蕴含在then语句中,且每个promise的返回值多了一个status字段,示意以后promise的状态,没有任何一个promise的信息被失落。

因而,当用Promise.allSettled时,咱们只需专一在then语句里,当有promise被异样打断时,咱们仍然能妥善处理那些曾经胜利了的promise,不用全部重来。

以后大环境对Promise.allSettled的反对

nodejs从v12.9.0开始退出了对Promise.allSettled的反对,支流浏览器们也各自在2019年公布的版本中反对了此办法,这意味着你曾经能够放心大胆的应用了。

对于那些不反对此办法的环境,你能够间接援用开源社区中实现了此办法的npm包:

  • promise.allsettled
  • promise-settle
  • promise-all-settled
  • es2015-promise.allsettled

或者,你能够间接基于Promise.all写一个polyfill,给你的我的项目打上补丁:

if (Promise && !Promise.allSettled) {
  Promise.allSettled = function (promises) {
    return Promise.all(promises.map(function (promise) {
      return promise.then(function (value) {
        return { state: 'fulfilled', value: value };
      }).catch(function (reason) {
        return { state: 'rejected', reason: reason };
      });
    }));
  };
}

结语

Promise.allSettled是对Promise.all的一种补充,当面对多个promise并行时,它额定提供了一种解决形式,解决了当多个promise并行时reject的呈现会随同着其余promise数据失落的问题。

参考资料

using-promise-allsettled-now

proposal-promise-allSettled

es2015-Promise.allSettled

nodejs v12.9.0 release notes

【腾讯云】轻量 2核2G4M,首年65元

阿里云限时活动-云数据库 RDS MySQL  1核2G配置 1.88/月 速抢

本文由乐趣区整理发布,转载请注明出处,谢谢。

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据