如何只调用一次这个回调函数?在我的For循环之后

时间:2018-04-12 16:46:43

标签: javascript arrays firebase firebase-realtime-database callback

上下文是我正在尝试从Posts数据库中检索名为firebase的记录列表,首先我收集了所有'下标的俱乐部'用户进入并将其放入数组SubscribedClubsList中,在此实例中,数组包含值ALT5BSM14,它们是数据库中俱乐部的关键名。

enter image description here

第一个for loop将浏览SubscribedClubList

中的所有项目

在我的数据库中,俱乐部有一个指定的空间,用于存储posts,如图所示。函数getData遍历俱乐部制作的每个帖子并将其存储在数组postArr中,之后我callback array postArr因为我想使用此列表存储posts以显示在我的网页上的表格中。

正如您在数据库截图中看到的,subscribed个社团中每个都有3个帖子,因此postArr的大小为6

但是,当我在我的代码上将其记录在底部并记录第一个俱乐部列表中的帖子,如console.log(arrNew[2])时,它会记录两次,例如

{Post: "meet and greet on friday", Timestamp: 1523298517138} {Post: "meet and greet on friday", Timestamp: 1523298517138}

当我记录来自第二俱乐部的任何帖子,例如console.log(arrNew[5])或console.log [3]时,它将记录类似于:

undefined {Post: "welcome", Timestamp: 1523359646325}

如何阻止它像这样两次登录并且有一次它按预期记录完整列表。

我认为这是因为callback在第一个for loop的第一次迭代之后运行,并从第一个俱乐部返回前3个帖子,然后在第二次迭代时返回6个帖子。

        function getPosts(callback){
        var x = 0; 
        var postArr = [];

        for (var y = 0 ; y < SubscripedClubsList.length ; y++){

         var ref = firebase.database().ref('ClubPosts').child(SubscripedClubsList[y]);
         ref.on('value', getData, errData);

        function getData(data){
            var posts = data.val();
            var keys = Object.keys(posts);
            for (var i = 0 ; i < keys.length; i++){
                var k = keys[i];

                postArr[x] = posts[k];
                x++;

            }

                callback(postArr);



        }

        function errData(err){
            console.log('Error');
            console.log(err);
        }

     }

    }

   getPosts(function (arrNew){
    console.log(arrNew[2]);
   });

1 个答案:

答案 0 :(得分:0)

在这样的回调周围添加一个简单的if条件。

if(y==SubscripedClubsList.length-1){ callback(postArr); }

我认为,这应该可以解决问题,因为回调只会在最后一个循环中被调用。