Dart - 在 for 循环中等待所有异步任务

Posted

技术标签:

【中文标题】Dart - 在 for 循环中等待所有异步任务【英文标题】:Dart - Await all async tasks in a for loop 【发布时间】:2021-03-15 21:19:27 【问题描述】:

我有一个 Dart 中的对象列表,我想对这些对象中的每一个执行异步操作。在所有异步操作都完成后,我想执行最后一个操作。我目前正在使用如下代码执行此操作:

for (int i = 0; i < myObjectList.length; i++) 
  await myAsynchronousOperation(myObjectList[i]);

doFinalOperation();

虽然这在技术上可行,但我认为它效率低下,因为 for 循环将在启动第二个异步操作之前等待第一个异步操作完成。所以根据我的理解,我们最终会同步触发异步操作,这不是异步编程的意图。

因此,我的问题是是否有可能一次触发所有异步操作,然后等到它们全部完成,然后最后执行最终操作。提前致谢!

【问题讨论】:

【参考方案1】:

使用Future.wait 等待多个正在运行的Futures:

await Future.wait([
  for (int i = 0; i < myObjectList.length; i++)
    myAsynchronousOperation(myObjectList[i]),
]);
doFinalOperation();

【讨论】:

感谢您的回答!然而,它向我提出了两个额外的问题: 1. android Studio 给了我以下警告:“直到版本 2.3.0 才支持 for、if 和 spread 元素,但此代码需要能够运行早期版本。”在这种情况下,这意味着什么? 2. 使用带括号的 for 循环时,此代码不起作用。以下错误:“参数类型 'List>>>' 不能分配给参数类型 'Iterable>'。”如果我想在 for 循环中插入一个 if 条件,那似乎是不可能的。 1.修改 pubspec.yaml 文件并指定更高的最低 Dart 版本。否则,工具会假定您的代码旨在与旧版本的 Dart SDK 保持兼容。 2. 如果myAsynchronousOperation 返回Future 并且您按照我在示例中给出的方式键入它,则代码应该可以工作。请注意,这是特殊的 collection-for 语法,您不能在循环体中添加花括号(),因为这会创建 Set 文字。 是的,您可以在集合-for 循环中使用if。它被称为collection-if 这是 2.3 中添加的内容:github.com/dart-lang/sdk/blob/master/… 如果 myAsynchronousOperation 真的已经是一个函数,那么这是我可能 使用新列表文字的少数几个地方之一,只需执行 @987654338 @.

以上是关于Dart - 在 for 循环中等待所有异步任务的主要内容,如果未能解决你的问题,请参考以下文章

Dart 异步

Dart 异步

Dart中的异步编程(Future、scheduleMicrotask)

Dart异步是怎么实现

Dart异步编程--Future

在赛普拉斯的 for 循环中等待异步方法