Promise.race vs. Promise.any和Promise.all vs. Promise.allSettled

照片来自Ryan Franco的Unsplash

JavaScript中的新功能(Google I / O '19)于2019年5月8日展示了静态Promise组合方法即Promise.allSettled和Promise.any即将发布的内容。

现代浏览器中已有两种方法,Promise.all和Promise.race。

让我们来看看差异以及每种方法的工作原理。

?先决条件

?承诺定义

我将跳过承诺是什么,直接跳到静态方法,并将讨论差异。

一个要点是,承诺是JavaScript向您承诺将完成工作(或者如果工作无法完成则可能失败)。

如果您熟悉C#,那就是类似的Task类。

有关详细信息,请参阅以下文档。

  • 承诺 – MDN上的JavaScript
  • JavaScript承诺:Google 开发工程师s简介

?承诺国家定义

  • 实现 – 成功解决承诺。
  • 拒绝 – 承诺失败。
  • 待定 – 承诺“既未履行也未拒绝”。
  • 定居 – 不是一个国家,而是一个描述承诺要么得到满足,要么被拒绝的总称。
    • 该术语稍后将用于描述新方法的特征。

有关状态和命运的更详细说明,请参阅各州和命运。

还有其他静态Promise方法,如Promise.reject,Promise.resolve但我只会介绍“combinator”方法,它将可迭代对象作为参数。

?差异

我们先来看看现有和新的组合方法之间的区别。

?Devise.all与Promise.allSettled

两者都接受一个可迭代的对象但是

  • Promise.all 一旦可迭代对象中的promise被拒绝,就拒绝。
  • Promise.allSettled 无论可迭代对象中的被拒绝的承诺如何,都可以解析。

?Promise.race与Promise.any

两者都接受一个可迭代的对象但是

  • Promise.race 在可迭代对象内的第一个已结算(已履行或已拒绝)承诺上的短路。
  • Promise.any 第一个履行承诺的短路并继续解决,不管被拒绝的承诺,除非迭代对象内的所有承诺都拒绝。

?比较表

现在让我们来看看现有/即将推出的组合方法。

现在让我们继续了解每种方法的更多信息。

请注意,所有“特征”均取自TC39提案README。

?Promise.all

  • 这是什么?解析作为可迭代对象传递的所有promise。
  • 成语 – 一个坏?破坏了一堆(“所有”)。
  • 特性 – 拒绝输入值时短路

?示例

什么时候 Promise.all 满足(promisesWithoutReject),所有苹果都归还。

后一个例子使用 promisesWithOneReject 表明一个被拒绝的承诺导致拒绝所有承诺。

?Promise.allSettled

  • 这是什么?所有承诺,无论结算(履行/拒绝)状态如何。
  • 成语 – 让我们“拭目以待”?。
  • 特点 – 不像Promise.all / race那样短路
  • 注意 – 适用于Chrome 76。

?示例

无论已解决(履行或拒绝)状态如何,所有承诺都会在没有短路的情况下解决 抓住

要区分解析值是否成功,它们将作为以下形状的对象数组返回。

  • 履行承诺作为 {status:'履行',价值}
  • 被拒绝的承诺返回为 {status:'被拒绝',原因}

?Promise.race

  • 这是什么?即使一个承诺拒绝,第一个履行承诺或拒绝承诺。
  • 成语 – 善于?)之间的竞赛(https://s.w.org/images/core/emoji/12.0.0-1/72×72/1f607.png)(已实现)和邪恶(?(被拒绝)
    • 虽然不是真的成语
  • 特性 – 输入值确定时短路

?示例

promiseWillFulfill 例如,第一个承诺在1毫秒内完成,因此人类幸存下来。

但第二个例子使用 promiseWillReject 承诺在1毫秒内拒绝,因此人类注定要失败。

最后一个例子(promisesWithOUTReject)履行了没有拒绝,因此第一个履行承诺价值“

三个“被归还。

从这些例子中,您可以看到第一个已解决的状态(已履行或已拒绝)使承诺短路。

?Promise.any

  • 这是什么?无论其他被拒绝的承诺如何,都会返回第一个履行的承诺。如果所有承诺都拒绝,则通过为所有拒绝提供错误来拒绝。
  • 成语 – 一切都很顺利。
  • 特性 – 满足输入值时短路。
  • 注意 – 尚未在任何浏览器中实现,它位于第1阶段。

?示例

第一个例子承诺立即拒绝,但由于履行了承诺而没有短路,因此你赢得了生命。

第二个例子承诺在一段时间后解决。第一个履行的承诺在一系列拒绝之后得到了解决,但没有发生短路。你能找到一份工作。

当所有承诺都拒绝时,那就是Promise.any拒绝你并且你没有得到任何工作机会。

?结论

我的理解是新的 Promise.allSettled /任何 引入Promise以尽力解决承诺,不同于现有的承诺,首次遭遇拒绝。

Promise.allPromise.race 已经在现代浏览器中可用(这不包括IE; p)和 Promise.allSettled 将在Chrome 76中提供。

Promise.any 仍处于第1阶段,并且在任何浏览器中都不可用(但在Bluebird或使用polyfill中可用 – 对于我使用的演示 – 任何用于演示的NPM库。)

我很想知道你会(有)使用(d)解决问题的方法。

如果您发现任何错误和/或我如何改进示例,请您告诉我们吗?

Promise.race与Promise.any和Promise.all与Promise.allSettled的帖子首先出现在Sung的技术博客上。

资讯来源:由0x资讯编译自DEV,原文:https://dev.to/dance2die/promise-race-vs-promise-any-and-promise-all-vs-promise-allsettled-26if ,版权归作者所有,未经许可,不得转载
你可能还喜欢