У меня сложный сценарий, когда я запрашиваю в своей базе данных 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);
});
}
});
}