簡體   English   中英

從 Firebase firestore 查詢數據時如何在 stream 內部等待

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM