当前位置: 首页 > 知识库问答 >
问题:

列表没有通过异步方法更新

杨柏
2023-03-14

这是我的代码:

List<String> databaseEntryID = <String>[];

readAllData() async {
    await db.collection("users").get().then((event) {
      for (var doc in event.docs) {
        print(doc.id);
        databaseEntryID.add(doc.id);
      }
    });
  }

  readData() {
    final docRef = db.collection(databaseEntryID[0]).doc(databaseEntryID[1]);
    docRef.get().then(
          (res) => print("Successfully completed"),
      onError: (e) => print("Error completing: $e"),
    );
  }

如果我先调用readAllData(),然后再调用readData(),我会得到一个RangeError:RangeError(索引):无效值:有效值范围为空:0。

我没有完全掌握异步是如何工作的,那么我在这里做错了什么,我如何首先更新列表,然后访问第一个和第二个字符串?


共有2个答案

车靖琪
2023-03-14

我在搜索后发现了这一点,应该先检查一下(我通常避免使用文档页面,因为它们太复杂了,比如,这一个就像指南一样):https://dart.dev/codelabs/async-await

所以最简单的解决方法是:

List<String> databaseEntryID = <String>[];

readAllData() async {
    await db.collection("users").get().then((event) {
      for (var doc in event.docs) {
        print(doc.id);
        databaseEntryID.add(doc.id);
      }
    });
  }

  readData() async {
    await readAllData();

    final docRef = db.collection(databaseEntryID[0]).doc(databaseEntryID[1]);
    docRef.get().then(
          (res) => print("Successfully completed"),
      onError: (e) => print("Error completing: $e"),
    );
  }

使用await关键字从〈code〉readData〈code〉调用〈code〉readAllData〈code〉函数,以显示它需要等待其返回,然后执行〈code〉readData〈code〉方法(需要异步修饰符)。

邢昊焜
2023-03-14

对于异步,我通常实现侦听器模式。这样,当您从async接收数据时,就可以使用它了。这里发生的基本情况是,在readAllData()结果到达之前,您无法读取Data()。您可以做/尝试做的是:1。


readAllData() async {
    await db.collection("users").get().then((event) {
      for (var doc in event.docs) {
        print(doc.id);
        databaseEntryID.add(doc.id);
      }
      // Do here the things you might want to do when receiving an information (such as notifying the listeners..)
    });
  }

或2。

List<String> databaseEntryID = <String>[];
Boolean databaseHydrated = false;

readAllData() async {
    await db.collection("users").get().then((event) {
      for (var doc in event.docs) {
        print(doc.id);
        databaseEntryID.add(doc.id);
      }
      databaseHydrated = true;
    });
  }

  readData() {
    if(databaseHydrated) {
      final docRef = db.collection(databaseEntryID[0]).doc(databaseEntryID[1]);
      docRef.get().then(
            (res) => print("Successfully completed"),
        onError: (e) => print("Error completing: $e"),
      );
    } else {
      // Do whatever you want, like toggle a loading screen while waiting for async data ?
    }
  }

希望有帮助!

 类似资料:
  • 没有await并且在非异步方法中调用异步方法的行为是什么?我这样问是因为我看到Visual Studio在调用异步方法时没有显示任何警告,好像这是一件非常正常的事情。在这种情况下,异步方法的行为是否像是同步的?

  • 本文向大家介绍Python通过select实现异步IO的方法,包括了Python通过select实现异步IO的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python通过select实现异步IO的方法。分享给大家供大家参考。具体如下: 在Python中使用select与poll比起在C中使用简单得多。select函数的参数是3个列表,包含整数文件描述符,或者带有可返回文件描述符的f

  • 本文向大家介绍Python通过poll实现异步IO的方法,包括了Python通过poll实现异步IO的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python通过poll实现异步IO的方法。分享给大家供大家参考。具体分析如下: 在使用poll()后返回轮询对象,该对象支持以下方法: pollObj.register(fd,[,eventmask])第一个参数是注册新的文件描述符fd

  • 我有一个,其中包含对项目进行抽样的概率(权重)。例如,包含如下所示的5个值。 我尝试了这样的方法,首先把概率列表做成累加形式。 0.1、0.5、0.7、0.8、1.0 那么我的做法如下。我生成一个随机double,并在列表上迭代以找到第一个大于随机double的项,然后返回它的索引。 我不确定二分搜索能有什么帮助。假设我生成了p=0.01。然后,二分搜索可以使用递归,如下所示。 0.01小于0.7

  • 背景: React代码如下 setCount的更新是异步更新的,setTimeout也是异步的,为什么点击,console.log打印的是0,而不是1。 尝试: 尝试用普通js函数进行比较,js代码如下 console.log打印的是最新的值2。 疑问: 两段代码的打印结果不同,是什么原因呢?

  • 我正在用SpringBoot构建一个应用程序。我有一个存储库,我通过以下方式从方法名称创建查询: 这样的查询可以工作,方法调用的结果是具有该名称的用户。在Spring Boot中是否可以按名称创建查询,其中输入是名称列表,输出是用户列表,其中每个用户至少对应于列表中的一个名称?例如: 我也试过这样的方法,但是行不通。