首页 > 解决方案 > 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();
  }

标签: flutterdartasync-await

解决方案


使用Future.wait(List<Future>)将等待文档中提到的所有没有顺序的异步操作。在连续使用 await 时,它会等待第一个 await 异步操作完成,然后再运行下一个 await 异步操作。如果在运行下一个异步操作之前有先决条件输出,则最好依次使用 await async。


推荐阅读