如何在 dart 中正确等待多个异步方法?

The*_*nax 3 asynchronous async-await dart flutter

我最近开始使用 flutter 进行开发。当启动我的应用程序时,我首先要加载来自不同来源的数据。我在这方面遇到了麻烦,似乎我还没有理解异步/等待。

我想做的事

启动我的应用程序时,我想从多个源加载数据。这应该并行完成,但只有在所有数据源完全加载后才应继续。

我尝试过的

import 'package:flutter/material.dart';

class AsyncTester extends StatefulWidget {
  @override
  _AsyncTesterState createState() => _AsyncTesterState();
}

class _AsyncTesterState extends State<AsyncTester> {
  @override
  void initState() {
    super.initState();
    startApplication();
  }

  @override
  Widget build(BuildContext context) {
    return Container();
  }

  void startApplication() async {
    await loadData();
    print("starting Application!");
  }

  loadData() {
    loadDataSource1();
    loadDataSource2();
  }

  void loadDataSource1() async {
    await Future.delayed(Duration(seconds: 3));
    print("Data Source 1 loaded.");
  }

  void loadDataSource2() async {
    await Future.delayed(Duration(seconds: 2));
    print("Data Source 2 loaded.");
  }
}
Run Code Online (Sandbox Code Playgroud)

输出是:

I/flutter (23100):启动应用程序!
I/flutter (23100):已加载数据源 2。
I/flutter (23100):已加载数据源 1。

我不明白为什么 startApplication() 不等待 loadData() 完成。我想这正是await 所做的?

顺便说一句,我将 loadDataSource1() 和 loadDataSource2() 嵌套在 loadData() 中,因为这样做

void startApplication() async {
   await loadDataSource1();
   await loadDataSource2();
   print("starting Application!");
}
Run Code Online (Sandbox Code Playgroud)

会一个接一个地加载数据。这是正确的还是有更好的方法来做到这一点?

Gui*_*oux 10

您应该使用Future.wait,此方法将并行执行两个异步操作,并在它们全部完成后完成:

void startApplication() async {
  await Future.wait([
    loadDataSource1(),
    loadDataSource2(),
  ]);
  print("starting Application!");
}
Run Code Online (Sandbox Code Playgroud)

  • 小问题:“Future.wait”*同时*等待多个异步操作。它们是否“并行”执行取决于这些异步操作的实现。 (2认同)