从 Firebase firestore 查询数据时如何在流内等待
对于上下文,我使用 Getx 状态管理进行 flutter,并且需要在我的 Rx
对象上调用 >
list.bindStream(availabilityStream())
。
这是我的availabilityStream方法
static Stream<List<Availability>> availabilityStream() {
return FirebaseFirestore.instance
.collection('availability')
.where('language',
isEqualTo: GetStorageController.instance.language.value)
.snapshots()
.map((QuerySnapshot query) {
List<Availability> results = [];
for (var availablity in query.docs) {
availablity["cluster"].get().then((DocumentSnapshot document) {
if (document.exists) {
print("Just reached here!");
//! Ignore doc if cluster link is broken
final model = Availability.fromDocumentSnapshot(
availabilityData: availablity, clusterData: document);
results.add(model);
}
});
}
print("result returned");
return results;
});
}
,我的可用性集合上的集群字段是另一个集合的引用字段。这里的问题是我需要等待 .get() 调用我的 firestore 或函数在返回数据之前返回。我无法在 map 函数或 Stream 的返回类型内等待变化。那么我如何在这里等待我的函数调用呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
根据我从评论中得到的建议,我使用 Stream.asyncMap 来等待所有网络调用 future 完成。
这是我更新的存储库
我认为它的工作原理是,正常的 .map 函数从 getAvailabilityAndCluster() 方法返回多个承诺,然后所有异步执行的进程都被放入 Future.wait() 中,这是一个等待的大承诺里面的所有承诺都要完成。然后将其传递给 .asyncMap() ,等待 Future.wait() 完成,然后再继续其结果。
using the advice i got from the comments I've used Stream.asyncMap to wait for all my network call futures to complete.
Here is my updated Repository
How i think this works is that the normal .map function returns multiple promises form the getAvailabilityAndCluster() method then all of the processes that execute asynchronously are all put to Future.wait() which is one big promise that waits all the promises inside it to complete. Then this is passed onto .asyncMap() which waits for the Future.wait() to complete before continuing with its result.