据我所知,在ES7/ES2016中,在代码中放置多个wait,将类似于使用承诺链接。然后(),这意味着它们将一个接一个地执行,而不是并行执行。例如,我们有以下代码:
等待someCall();
等待另一个呼叫();
我是否正确理解只有在someCall()完成时才会调用anotherCall()?什么是并行调用它们的最优雅方式
我想在Node中使用它,所以可能有一个使用异步库的解决方案
编辑:我不满意这个问题中提供的解决方案:由于异步生成器中承诺的非并行等待而导致的减速,因为它使用生成器,我想问一个更通用的用例
您可以在Promise.all()上等待:
等待承诺。全部([someCall(),anotherCall()]);
要存储结果,请执行以下操作:
让[someResult,anotherResult]=等待承诺。全部([someCall(),anotherCall());
请注意,Promise.all很快就会失败,这意味着一旦提供给它的一个承诺被拒绝,那么整个东西就会被拒绝
const happy=(v,ms)=>;新承诺((解析)=>;设置超时(()=>;解析(v),毫秒))
常数sad=(v,ms)=>;新承诺((拒绝)=>;设置超时(()=>;拒绝(v),毫秒))
承诺。所有([快乐('happy',100),悲伤('sad',50)])
.then(console.log).catch(console.log)/“sad”
相反,如果您希望等待所有承诺兑现或拒绝,则可以使用Promise.allselled。请注意,Internet Explorer本机不支持此方法
const happy=(v,ms)=>;新承诺((解析)=>;设置超时(()=>;解析(v),毫秒))
常数sad=(v,ms)=>;新承诺((拒绝)=>;设置超时(()=>;拒绝(v),毫秒))
承诺。一切都解决了([高兴('happy',100),悲伤('sad',50)])
.then(console.log)/[{“状态”:“完成”,“值”:“快乐”},{“状态”:“拒绝”,“原因”:“悲伤”}]
注意:如果您使用
承诺。所有在拒绝发生之前设法完成的操作都不会回滚,因此您可能需要注意这种情况。例如
如果你有5个动作,4个快速、1个慢速和慢速拒绝。那四个
操作可能已经执行,因此您可能需要回滚。在这种情况下,考虑使用承诺>解决了,但它提供了动作失败的精确细节,而不是。