基于一组值ASYNC问题的嵌套Firebase查询

时间:2018-09-11 22:17:51

标签: javascript firebase react-native firebase-realtime-database

我有一个复杂的场景,我在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);
        });
      }
});
}

0 个答案:

没有答案