这是我的代码:
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。
我没有完全掌握异步是如何工作的,那么我在这里做错了什么,我如何首先更新列表,然后访问第一个和第二个字符串?
我在搜索后发现了这一点,应该先检查一下(我通常避免使用文档页面,因为它们太复杂了,比如,这一个就像指南一样):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〉方法(需要异步修饰符)。
对于异步,我通常实现侦听器模式。这样,当您从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中是否可以按名称创建查询,其中输入是名称列表,输出是用户列表,其中每个用户至少对应于列表中的一个名称?例如: 我也试过这样的方法,但是行不通。