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.all
& Promise.race
已经在现代浏览器中可用(这不包括IE; p)和 Promise.allSettled
将在Chrome 76中提供。
Promise.any
仍处于第1阶段,并且在任何浏览器中都不可用(但在Bluebird或使用polyfill中可用 – 对于我使用的演示 – 任何用于演示的NPM库。)
我很想知道你会(有)使用(d)解决问题的方法。
如果您发现任何错误和/或我如何改进示例,请您告诉我们吗?
Promise.race与Promise.any和Promise.all与Promise.allSettled的帖子首先出现在Sung的技术博客上。