Как дождаться, пока несколько потоков Firestore вернут данные в Flutter

#firebase #flutter #dart #firebase-realtime-database #google-cloud-firestore

# #firebase #flutter #dart #firebase-realtime-database #google-облако-firestore

Вопрос:

Я хочу запросить две коллекции Firestore, но хочу вернуть только данные коллекции, которая возвращает результат быстрее, чем другая.

Мой подход заключался в том, чтобы использовать 2 потока и ждать, пока один из них вернет данные, которые я затем смогу вернуть.

Я использовал параметр onData, но компилятор никогда не переходит в метод onData, даже если в коллекциях есть данные, соответствующие запросу.

     var someId;

    CollectionReference collection1 = _db.collection('collection1');
    CollectionReference collection2 = _db.collection('collection2');

    Query collection1Query = collection1.where('users', arrayContains: uid);
    Query collection2Query = collection2.where('users', arrayContains: uid);

    var resultStream1 = collection1Query.snapshots().listen((doc) {});
    var resultStream2 = collection2Query.snapshots().listen((doc) {});

    while(someId == null){
      resultStream1.onData((data) {
        var someId = data.docs.first.id;
      });
      resultStream2.onData((data) async {
        var someId = data.docs.first.id;
        await doOneMoreThing(someId);
      });
    }
    resultStream1.cancel();
    resultStream2.cancel();

    return someId;
 

Комментарии:

1. проверьте StreamGroup / StreamZip

Ответ №1:

Для этого проверьте асинхронный пакет, в котором есть класс с именем StreamGroup, и вы можете объединить N потоков для записи этого класса:

 final newStream = StreamGroup.merge([streamOne, streamTwo]);
 

Затем вы можете использовать этот newStream как общий поток.