flutter - Flutter:'Future.wait' 并行的多个异步函数 VS 'await' 一次一个。<= 不同的结果
问题描述
我最近了解到等待多个异步函数完成使用的绝妙方法Future.wait([asyncFuncOne(), asyncFunctwo()])
但是,在运行这些代码块中的任何一个时,我注意到了两种不同的结果。一个等待每个函数完成,另一个Future.wait
用于并行处理。我究竟做错了什么?
方法一:
await msm.initProfileData();
await msm.initActivityFeed();
await msm.getRecentlyActiveUsers();
await msm.getRecommendedUsers();
await msm.getGroups();
await msm.getFollowing();
await msm.getFollowers();
方法二:
await Future.wait([
msm.getFollowing(),
msm.initProfileData(),
msm.initActivityFeed(),
msm.getRecentlyActiveUsers(),
msm.getRecommendedUsers(),
msm.getGroups(),
msm.getFollowers(),
]);
在方法 1 中,所有异步功能在我的应用程序主屏幕出现之前完成。在方法 2 中,主屏幕会在所有异步功能完成之前出现。
提前欢呼和感谢。
编辑:附加代码示例。
@override
void initState() {
super.initState();
googleSignIn.onCurrentUserChanged.listen((account) {
handleSignIn(account);
}, onError: (err) {
print('Error signing in: $err');
});
googleSignIn.signInSilently(suppressErrors: false).then((account) {
handleSignIn(account);
}).catchError((err) {
setState(() => _showSignIn = true);
print('Error signing in: $err');
});
}
handleSignIn(GoogleSignInAccount account) async {
if (account != null) {
await createUserInFirestore();
setState(() {
isAuth = true;
});
} else {
setState(() {
isAuth = false;
_showSignIn = true;
});
}
}
createUserInFirestore() async {
final GoogleSignInAccount user = googleSignIn.currentUser;
DocumentSnapshot doc = await usersRef.document(user.id).get();
//...
//do stuff
//...
await someFunc1(); //Method1
// await comeFunc2(); //Method2
//do more stuff
}
someFunc1() async {
msm.asyncfunc1();
msm.asyncfunc2();
}
someFunc2() async {
await Future.wait([
msm.asyncFunc1(),
msm.asyncFunc2(),
]);
}
@override
Widget build(BuildContext context) {
return isAuth ? buildAuthScreen() : buildUnAuthScreen();
}
解决方案
使用Future.wait(List<Future>)
将等待文档中提到的所有没有顺序的异步操作。在连续使用 await 时,它会等待第一个 await 异步操作完成,然后再运行下一个 await 异步操作。如果在运行下一个异步操作之前有先决条件输出,则最好依次使用 await async。