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
等待多个正在运行的Future
s:
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 循环时,此代码不起作用。以下错误:“参数类型 'Listpubspec.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 循环中等待所有异步任务的主要内容,如果未能解决你的问题,请参考以下文章