【问题标题】:How do you correctly await multiple asynchronous methods in dart?你如何正确地等待飞镖中的多个异步方法?
【发布时间】:2021-06-22 19:02:44
【问题描述】:

我最近开始使用 Flutter 进行开发。 启动我的应用程序时,我首先想从不同来源加载数据。 我遇到了麻烦,似乎我还没有理解 async / await。

我想做的事

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

我尝试了什么

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.");
  }
}

输出是:

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!");
}

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

【问题讨论】:

  • loadData()函数中,您需要await进行其他调用,以暂停程序执行,直到返回具有值的Future

标签: flutter dart asynchronous async-await


【解决方案1】:

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

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

【讨论】:

  • 次要挑剔:Future.wait同时等待多个异步操作。它们是否并行执行取决于这些异步操作的实现。
  • 没错,在上面显示的示例中,它将是并行的,但正如您所说,它可能会因操作而异。
  • 谢谢!介意解释为什么我的实现不起作用?在我看来,等待加载数据()应该在打印语句执行之前完成。
  • 您需要使您的方法 loadData 异步并在其中进行等待。
  • 那么 await someMethod() 只等待 someMethod() 中的其他 await 语句?
猜你喜欢
  • 2019-05-07
  • 2021-09-05
  • 2021-09-15
  • 1970-01-01
  • 2020-08-01
  • 2021-11-28
  • 2019-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多