Вложенные запросы Firebase на основе массива значений Проблемы ASYNC - PullRequest
0 голосов
/ 12 сентября 2018

У меня сложный сценарий, когда я запрашиваю в своей базе данных Firebase активность (лайки, сообщения) пользователя.Затем, используя эти данные, я снова запрашиваю, чтобы найти пользователей с соответствующими данными.Для этого я использовал решение forloop в первом запросе, в котором на каждой итерации я делаю еще одну ссылку на базу данных с другим ключевым словом для запроса.

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

Однако я сталкиваюсь с проблемами с асинхронной природой запросов Firebase.Поскольку я не могу гарантировать, когда у меня будет массив пользователей, я не могу создать другую ссылку на firebase, используя массив пользователей, так как он все еще не определен.Кроме того, я не могу сделать функцию обратного вызова, потому что я должен вызывать обратный вызов в запросе firebase, но он находится в forloop, так что это сильно повлияет на время выполнения.

Есть ли какие-либо решения для этого?Я подумал, что можно было бы просто переместить обработку пользователей в componentDidUpdate после установки состояния «загрузка» в componentDidMount в значение false, но это выглядит как неправильное использование componentDidUpdate, так как я чувствую, что у меня должны быть все мои данные послеcomponentDidMount.

Вот фрагмент кода:

componentDidMount(){
firebaseApp.database().ref("Restaurant_Tags").orderByChild("Author_ID")
                      .equalTo("test").once('value', (snap) =>{

      var queryObject = snap.val();
      var tagKeys = Object.keys(queryObject);
      var uniqueRestaurants = {};
      for(var i = 0; i < tagKeys.length; i++){
        if(!(queryObject[tagKeys[i]]["Restaurant_ID"] in uniqueRestaurants)){
          uniqueRestaurants[queryObject[tagKeys[i]]["Restaurant_ID"]] = 1;
        }
      }

      for(var key in uniqueRestaurants){
        this.uniqueRestaurantsArray.push(key);
      }

      //finding users with same restaurant tags
      for(var i = 0; i < this.uniqueRestaurantsArray.length; i++){
        firebaseApp.database().ref("Restaurant_Tags").orderByChild("Restaurant_ID")
                              .equalTo(this.uniqueRestaurantsArray[i])
                              .once('value', (snap) =>{
                var queryObject2 = snap.val();
                var keys = Object.keys(queryObject2);
                var foundUsers = {};
                for(var j = 0; j < keys.length; j++){
                  if(queryObject2[keys[j]]["Author_ID"] == "test"){
                    continue;
                  }
                  else{
                    if(!(queryObject2[keys[j]]["Author_ID"] in foundUsers)){
                      foundUsers[queryObject2[keys[j]]["Author_ID"]] = 1;
                    }
                  }
                }
                for(var key in foundUsers){
                  this.mutualUsers.push(key);
                }
                console.log(this.mutualUsers);
        });
      }
});
}
...