上下文是我正在尝试从Posts
数据库中检索名为firebase
的记录列表,首先我收集了所有'下标的俱乐部'用户进入并将其放入数组SubscribedClubsList
中,在此实例中,数组包含值ALT5
和BSM14
,它们是数据库中俱乐部的关键名。
第一个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]);
});
答案 0 :(得分:0)
在这样的回调周围添加一个简单的if条件。
if(y==SubscripedClubsList.length-1){
callback(postArr);
}
我认为,这应该可以解决问题,因为回调只会在最后一个循环中被调用。