[英]How to await inside a stream while querying data from Firebase firestore
对于上下文,我正在使用 Getx state 管理 flutter,我需要在我的Rx<List<Availability>>
object 上调用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 或 function 在返回数据之前返回。 我无法在 map function 或 Stream<List> 的返回类型更改中等待。 那么我如何才能在这里等待我的 function 电话呢?
使用我从评论中得到的建议,我使用 Stream.asyncMap 等待所有 my.network 调用期货完成。
这是我更新的存储库
class AvailabilityRepository {
static Future<Availability> getAvailabilityAndCluster(
QueryDocumentSnapshot availability) async {
return await availability["cluster"]
.get()
.then((DocumentSnapshot document) {
if (document.exists) {
//! Ignore doc if cluster link is broken
final model = Availability.fromDocumentSnapshot(
availabilityData: availability, clusterData: document);
return model;
}
});
}
static Stream<List<Availability>> availabilityStream() {
return FirebaseFirestore.instance
.collection('availability')
.where('language',
isEqualTo: GetStorageController.instance.language.value)
.snapshots()
.asyncMap((snapshot) => Future.wait(
snapshot.docs.map((e) => getAvailabilityAndCluster(e))));
}
}
我认为这是如何工作的是 normal.map function 从 getAvailabilityAndCluster() 方法返回多个承诺然后所有异步执行的进程都被放入 Future.wait() 这是一个大的 promise 等待它里面的所有承诺去完成。 然后将其传递到 asyncMap() 上,等待 Future.wait() 完成,然后再继续其结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.