在 for 循环中等待查询 - Flutter Firebase
Wait for query inside for loop - Flutter Firebase
我有这个功能可以根据用户的 ID 创建用户列表。对每个 id 进行查询以从 Firebase RTDB 获取信息。
static List<FrediUser> formattedParticipantListFromIDs(List<String> participantIDs) {
List<FrediUser> formattedParticipants = [];
for (String id in participantIDs) {
dbQuery(2, 'users', id).once().then((value) {
formattedParticipants.add(FrediUser.fromMap(value.snapshot.value as Map));
});
}
print(formattedParticipants.length);
Future.delayed(const Duration(seconds: 3), () {
print(formattedParticipants.length);
});
return formattedParticipants; }
第一个打印语句的输出
0
第二个打印语句的输出
3
问题
return 始终是一个空列表。如您所见,循环和 return 语句不等待列表被填充。但是,如果您等待 3 秒,列表确实会填充,但为时已晚。
如何在 for 循环的每次迭代中等待查询完成以及 .then 被调用和完成?
*此方法在class的工厂构造函数中调用,因此不能使用futures和awaits。
您需要使用 await
来等待异步 once()
方法。
//
static Future<List<FrediUser>> formattedParticipantListFromIDs(List<String> participantIDs)
async {
//
List<FrediUser> formattedParticipants = [];
for (String id in participantIDs) {
//
var value = await dbQuery(2, 'users', id).once();
formattedParticipants.add(FrediUser.fromMap(value.snapshot.value as Map));
}
print(formattedParticipants.length);
return formattedParticipants;
}
如您所见,这意味着您的 formattedParticipantListFromIDs
函数必须标记为 async
,并且 returns 和 Future
。没有办法阻止这种情况,因为没有办法使异步代码同步运行。
有关这方面的更多信息,我建议参加 Asynchronous programming: futures, async, await
上的 Dart 代码实验室
我有这个功能可以根据用户的 ID 创建用户列表。对每个 id 进行查询以从 Firebase RTDB 获取信息。
static List<FrediUser> formattedParticipantListFromIDs(List<String> participantIDs) {
List<FrediUser> formattedParticipants = [];
for (String id in participantIDs) {
dbQuery(2, 'users', id).once().then((value) {
formattedParticipants.add(FrediUser.fromMap(value.snapshot.value as Map));
});
}
print(formattedParticipants.length);
Future.delayed(const Duration(seconds: 3), () {
print(formattedParticipants.length);
});
return formattedParticipants; }
第一个打印语句的输出
0
第二个打印语句的输出
3
问题
return 始终是一个空列表。如您所见,循环和 return 语句不等待列表被填充。但是,如果您等待 3 秒,列表确实会填充,但为时已晚。
如何在 for 循环的每次迭代中等待查询完成以及 .then 被调用和完成?
*此方法在class的工厂构造函数中调用,因此不能使用futures和awaits。
您需要使用 await
来等待异步 once()
方法。
//
static Future<List<FrediUser>> formattedParticipantListFromIDs(List<String> participantIDs)
async {
//
List<FrediUser> formattedParticipants = [];
for (String id in participantIDs) {
//
var value = await dbQuery(2, 'users', id).once();
formattedParticipants.add(FrediUser.fromMap(value.snapshot.value as Map));
}
print(formattedParticipants.length);
return formattedParticipants;
}
如您所见,这意味着您的 formattedParticipantListFromIDs
函数必须标记为 async
,并且 returns 和 Future
。没有办法阻止这种情况,因为没有办法使异步代码同步运行。
有关这方面的更多信息,我建议参加 Asynchronous programming: futures, async, await
上的 Dart 代码实验室