Future.wait处理多个不相关异步任务同时分发的场景可以提高程序执行效率,最终总耗时是其中耗时最长任务耗时,不是所有任务总和。
await是Dart语言提供的语法糖,因其可读性和易用性很容易存在乱用而影响代码效率的情况。如下callFuns中模拟了两个异步任务fun1耗时2s, fun2耗时3s,
main(List<String> args) async {
var t1 = DateTime.now().millisecondsSinceEpoch;
await callFuns();
var t2 = DateTime.now().millisecondsSinceEpoch;
print('cost ${t2 - t1}');
}
Future callFuns() async {
var r = await fun1();
var r2 = await fun2();
print('r = $r');
print('r2 = $r2');
}
Future<String> fun1() {
return Future.delayed(Duration(seconds: 2), () {
return "future 1";
});
}
Future<String> fun2() {
return Future.delayed(Duration(seconds: 3), () {
return "future 2";
});
}
输出结果:
看起来没啥问题~~~ ,但是其实可以用Future.wait来提高程序运行效率。
main(List<String> args) async {
var t1 = DateTime.now().millisecondsSinceEpoch;
await callFuns2();
var t2 = DateTime.now().millisecondsSinceEpoch;
print('cost ${t2 - t1}');
}
Future callFuns2() async {
var rArr = await Future.wait([fun1(), fun2()]);
var r = rArr[0];
var r2 = rArr[1];
print('r = $r');
print('r2 = $r2');
}
Future<String> fun1() {
return Future.delayed(Duration(seconds: 2), () {
return "future 1";
});
}
Future<String> fun2() {
return Future.delayed(Duration(seconds: 3), () {
return "future 2";
});
}
输出结果:
答案是否定的! 这涉及到await语法糖解决的是什么问题和应用场景,await解决的是相互依赖的Future间回调地狱和代码可读性问题,如下代码:
login("alice","******").then((id){
//登录成功后通过,id获取用户信息
getUserInfo(id).then((userInfo){
//获取用户信息后保存
saveUserInfo(userInfo).then((){
//保存用户信息,接下来执行其他操作
...
});
});
})
可以看到获取用户信息和保存用户信息这两个Future之间是有依赖关系的,后者依赖前者的结果userInfo。
所以如果有多个不相关的异步可以用Future.wait来处理,因为wait参数中多个任务之间并没有必然的依赖关系,但是如果直接有依赖关系,则不适用Future.wait的场景。
不要在Iterable的foreach方法执行await异步任务,它们不是顺序执行的。
void main(){
f() async{
[1,2,3].forEach((i) async {
String r = await getNetworkData(i);
print('r= $r');
});
print('done');
}
f();
}
Future<String> getNetworkData(int second) {
return Future.delayed(Duration(seconds: 3), () {
return "network data $second";
});
}
猜猜上面执行结果是怎样的? 没错,不是你想的那样:顺序打印数据最后打印done ,而是
用for in 或者 Future.foreach
void main() {
f2() async {
for (final i in [1, 2, 3]) {
String r = await getNetworkData(i);
print('r= $r');
}
print('done');
}
f3() {
Future.forEach<int>([1, 2, 3], (i) async {
String r = await getNetworkData(i);
print('r= $r');
}).then((value) {
print('done');
;
});
}
//f2和f3均可
//f2();
f3();
}
Future<String> getNetworkData(int second) {
return Future.delayed(Duration(seconds: 3), () {
return "network data $second";
});
}
输出:
【Flutter 异步编程 -伍】 | 深入剖析 Future 类源码实现 - 掘金
异步编程: 一次性搞懂 Promise, async, await (#js #javascript)_哔哩哔哩_bilibili