我想在未来的很多功能完成后做点什么,我不知道如何在dart中编写代码?像这样的代码:
for (var d in data) {
d.loadData().then()
}
// when all loaded
// do something here
Run Code Online (Sandbox Code Playgroud)
但我不想一个一个地等他们:
for (var d in data) {
await d.loadData(); // NOT NEED THIS
}
Run Code Online (Sandbox Code Playgroud)
如何在dart中编写这些代码?
Gün*_*uer 56
您可以Future.wait用来等待期货清单:
import 'dart:async';
Future main() async {
var data = [];
var futures = <Future>[];
for (var d in data) {
futures.add(d.loadData());
}
await Future.wait(futures);
}
Run Code Online (Sandbox Code Playgroud)
Tob*_*all 17
如果您想等待不同类型的多个 future 并且还支持空安全,那么您可以在使用Dart >= 3.0时添加类似于以下内容的辅助函数:
Future<(T1, T2)> waitConcurrently<T1, T2>(
Future<T1> future1,
Future<T2> future2,
) async {
late T1 result1;
late T2 result2;
await Future.wait([
future1.then((value) => result1 = value),
future2.then((value) => result2 = value)
]);
return (result1, result2);
}
Run Code Online (Sandbox Code Playgroud)
Dart < 3.0本身不支持元组,但 Google 提供了一个包:https: //pub.dev/packages/tuple
import 'package:tuple/tuple.dart';
Future<Tuple2<T1, T2>> waitConcurrently<T1, T2>(
Future<T1> future1, Future<T2> future2) async {
late T1 result1;
late T2 result2;
await Future.wait([
future1.then((value) => result1 = value),
future2.then((value) => result2 = value)
]);
return Tuple2(result1, result2);
}
Run Code Online (Sandbox Code Playgroud)
现有答案提供了足够的信息,但我想添加注释/警告。如文档中所述:
返回的 future 的值将是所有产生的值的列表 按照迭代期货提供期货的顺序。
因此,这意味着下面的示例将4作为第一个元素(索引 0)和2第二个元素(索引 1)返回。
import 'dart:async';
Future main() async {
print('start');
List<int> li = await Future.wait<int>([
fetchLong(), // longer (which gives 4) is first
fetchShort(), // shorter (which gives 2) is second
]);
print('results: ${li[0]} ${li[1]}'); // results: 4 2
}
Future<int> fetchShort() {
return Future.delayed(Duration(seconds: 3), () {
print('Short!');
return 2;
});
}
Future<int> fetchLong() {
return Future.delayed(Duration(seconds: 5), () {
print('Long!');
return 4;
});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7437 次 |
| 最近记录: |