[英]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.