当前位置: 首页 > 面试题库 >

等待VS Promise.all

夏侯彬郁
2023-03-14
问题内容

之间有什么区别:

const promises = await Promise.all(items.map(e => somethingAsync(e)));
for (const res of promises) {
  // do some calculations
}

还有这个 ?

for await (const res of items.map(e => somethingAsync(e))) {
  // do some calculations
}

我知道在第一个摘要中,所有的诺言都同时被兑现了,但是我不确定第二个。for循环是否等待第一次迭代完成以调用下一个promise?还是所有的诺言都在同一时间触发,循环的内部就像它们的回调一样?


问题答案:

是的,它们绝对不同。for await应该与异步迭代器一起使用,而不是与预先存在的promise数组一起使用。

为了清楚起见,

for await (const res of items.map(e => somethingAsync(e))) …

与…相同

const promises = items.map(e => somethingAsync(e));
for await (const res of promises) …

要么

const promises = [somethingAsync(items[0]), somethingAsync(items[1]), …);
for await (const res of promises) …

somethingAsync在等待任何事情之前,这些呼叫立即立即发生。然后,await一个接一个地编辑它们,如果其中任何一个被拒绝,这绝对是一个问题:这将导致未处理的promise拒绝错误。
使用Promise.all是处理promise数组的唯一可行选择

for (const res of await Promise.all(promises)) …

请参阅[等待多个并发的await操作](http://codingdict.com/questions/77320和[aprom
Promise.all()与多次await之间有什么区别?](http://codingdict.com/questions/77321有关详细信息。



 类似资料:
  • 我正在尝试将数据库调用移出控制器,以清理并使其可测试。当它们在控制器中时,一切都会顺利进行。我将它们移出控制器,并添加了一个异步,以确保我们等待。否则,我将调用的中的函数。现在,一旦我使用async/await,控制器中的函数就会认为没有用户,因为它没有等待。 有几个关于异步等待的SO问题,但我没有找到一个解决我的问题。我确实验证了返回了我的用户,并添加了控制台日志来显示路径。 节点猫鼬异步等待似

  • 我在网上搜索了很多关于vs await async,但是在这个特定的使用场景中,我并不真正理解其中的区别。我相信情况很简单。 vs. 其中,是一个异步方法,其中包含一些异步调用,例如使用wait调用db。 问题: 在这种情况下,两者之间有什么区别吗?任何帮助或意见,谢谢!

  • 问题内容: 如何更改以下代码,以触发两个异步操作并有机会同时运行? 我需要做这样的事情吗? 问题答案: TL; DR 不要在获得承诺的问题中使用模式,而是分别等待它们;而是使用(至少现在): 虽然您的解决方案 确实 并行运行这两个操作,但如果两个诺言都被拒绝,它就无法正确处理拒绝。 细节: 您的解决方案并行运行它们,但始终等待第一个完成,然后再等待第二个。 如果您只想启动它们,并行运行它们,并获得

  • 问题内容: 我已经看到和在使用selenium的代码。使用轮询技术,即它将针对特定的每个固定间隔进行轮询。我想知道如何处理? 考虑以下Java示例: 监视器是否可单击,或者等待18秒钟再单击? 问题答案: 在您的示例中,在超时之前,将持续18秒(每0.5秒)查找一次“帐户”。 是的子类。在其中,您可以配置更多选项以及最长的等待时间,例如轮询间隔,忽略的异常等。此外,在您的代码中,您无需等待,然后可

  • 问题内容: 我如何更改以下代码,以触发两个异步操作并有机会同时运行? 我需要做这样的事情吗? 问题答案: TL; DR 不要在获得承诺的问题中使用模式,而是分别等待它们;而是使用(至少现在): 虽然您的解决方案确实并行运行这两个操作,但是如果两个诺言都被拒绝,它就无法正确处理拒绝。 细节: 您的解决方案并行运行它们,但始终等待第一个完成,然后再等待第二个。如果您只想启动它们,并行运行它们,并获得两

  • 如果吊舱已经处于状态,我还希望命令立即返回。但这不会发生。 kubectl wait不是我要找的命令吗?

  • 我通读了Dart/flatter中的Async/Await/then,试图理解为什么aysnc函数中的Await不会等到完成后再继续。在我的UI中,有一个按钮调用一个异步方法来返回一个位置,该位置总是返回null,并且不等待函数完成。 该函数将调用推送到一个新的UI页面,该页面选择一个位置,并应返回一个结果。如何使该函数等待结果?我不是在使用异步吗?

  • 问题内容: 我正在使用Ubuntu 16.04 问题答案: 我遇到了这个问题,终于找到了答案。我一直在使用Marionette驱动程序,该驱动程序不再适用于FF版本53和Selenium 3.5或更高版本。该GeckoDriver文档显示系统属性应该如何引用。 我从以下位置更改了代码: 至: 现在我的本地Firefox运行正常。 希望这对其他人有帮助。