Как согласовать последовательные запросы на Flutter, с FirebaseDatabase? - PullRequest
0 голосов
/ 12 апреля 2020

В контексте, где я использую BLOC, я создал файл службы, в котором я два раза подряд запрашиваю БД (в разных папках) и обрабатываю эти данные, а затем возвращаю их в состоянии в BLO C.

Когда я отправляю RequestNewListEvent на мой BLO C, это mapEventToState вызывается:

 Stream<DatosState> mapEventToState (DatosState currentState,
      DatosEvent event) async* {
    if (event is RequestNewListEvent) { 

      yield await _mapRequestNewListToState(event);

}

  Future<DatosState> _mapRequestNewListToState(RequestNewListEvent event) async{

    List<datoItem> returnedData= await DatosService.getDatos(event.category); 

      return ListItemsUpdatedState(returnedData); //I return an State to update the UI

 }

структура (упрощенная) этого DatosService .getDatos (категория String) :

     List dataToReturn= new List();
     List dataSortedByFame= new List();

    DBQueryDataInCategory().then((snapshot1){ /*filling dataSortedByFame with snapshot1*/  
}).then((_){
    DBQueryMoreInfoFromDataItem((snapshot2){ /*using dataOrderedByFame mixing with snapshot2 and preparing dataToReturn */
}) }).then((_)=>  {return dataToReturn;});

Расширенная (но не полная) версия того же DatosService.getData (категория String) :

  List<int> dataSortedByFame= new List<int>();
  List<datoItem> dataToReturn= new List<datoItem>();

 await db
      .child('datosPorCategoria/' + category) 
      .once()
      .then((DataSnapshot snapshot) async{
    Map<dynamic, dynamic> values =
        new Map<dynamic, dynamic>.from(snapshot.value);

    values.sort((a, b) {
       //I sort them by Fame
    });

    values.forEach((a) { 
      //i process 'a'
      dataSortedByFame.add(a); 

  }).then((_)  { //Now i'm going to query more information from another folder where is found more 
                 //information about those Items
      db
        .child('/infoPorDATO')
        .once()
        .then((DataSnapshot snapshot)  {


      List<dynamic> valores = new List<dynamic>.from(snapshot.value);


      dataSortedByFame.forEach((a) {
            print("___DatosService101");

        dataToReturn
            .add(datoItem.fromJson(Map<String, dynamic>.from(valores[a])));
      });
    });

  }).then((_){ 

   print("___DatosService102");
   return dataToReturn;
 });

Проблема: глядя на консоль, я получаю возвращаемые данные (с данными, равными нулю), до завершения второго запроса (где аргумент dataToReturn получает свое значение))

консоль печатает что-то вроде

DatosService.getData has returned with data: null
___DatosService101
___DatosService102
___DatosService101
___DatosService102
___DatosService101
___DatosService102
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...