我有一个复杂的场景,我在Firebase数据库中查询用户的活动(点赞,帖子)。 然后,使用该数据,我再次查询以查找具有匹配数据的用户。为此,我在第一个查询中使用了forloop的解决方案,其中在每次迭代中,我都会使用不同的关键字来另一个引用数据库。
然后,我必须在用户列表中找到其数据并以其他方式处理。
但是,我遇到了具有Firebase查询异步特性的问题。由于无法确定何时会真正拥有用户数组,因此无法使用用户数组创建对Firebase的另一个引用,因为它仍然是未定义的。另外,我无法创建回调函数,因为必须在firebase查询中调用该回调函数,但是它位于forloop中,因此会大大影响运行时间。
有什么解决办法吗?我以为在将componentDidMount中的“正在加载”状态设置为false后,可以将用户的处理简单地移动到componentDidUpdate,但这似乎是对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);
});
}
});
}