JavaScript 数组不可迭代

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

昨晚我在一个简单的 JavaScript 数组中遇到了一个非常奇怪的问题。我正在开发一个由 Firebase 提供支持的 React Native 应用程序,并使用 SDK 从实时数据库获取数据。

这是代码:

    var app = this

    this.props.fb.auth().onAuthStateChanged(function(user) {
        if (user) {
            app.props.fb.database().ref('/users/' + user.uid + "/timeline").once('value').then(function(snapshot) {
                var posts = snapshot.val()
                return posts
            }).then((posts) => {                
                var statuses = [];
                for (i in posts) {

                    app.props.fb.database().ref('/posts/' + posts[i]).once('value').then(function(snapshot) {
                       statuses.push(snapshot.val())
                    });
                }

                console.log(statuses)
            })
        }

    });

上面的代码应该从每个用户的时间轴获取数据,迭代时间轴上的每个帖子并然后从posts获取帖子的数据。然后,它只是将数据推送到 statuses 数组,该数组在最后被控制台记录。

这是控制台上显示的内容。 enter image description here

在数组展开之前,控制台不会显示数组中的项目。此外,当我尝试获取数组的长度时,它返回 0,并且我也无法迭代数组上的项目。

我做错了什么?

最佳答案

如果 posts 是一个可迭代的,我会考虑使用 q.all 的某个版本,然后当所有的 promise 都得到解决时,你可以可靠地记录将所有这些片段推送到 statuses 数组的结果。

一些伪代码:

if (user) {
        app.props.fb.database().ref(`/users/${user.uid}/timeline`)
        .once('value')
        .then(snapshot => snapshot.val())
        .then(posts => {                
            const statuses = [];

            const promises = Object.keys(posts).map(key => {
                return app.props.fb.database().ref(`/posts/${posts[key]}`).once('value')
                    .then(snapshot => statuses.push(snapshot.val()));
            }

            return Promises.all(promises)
        })
        .then(() => console.log(statuses));
    }

关于JavaScript 数组不可迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46930001/

相关文章:

javascript - Accordion 内的 Angular Dynamic ngmodel 名称

javascript - Raphael 路径中的自定义属性

javascript - 如何更新数组对象的数组特定属性

swift - 从 Firebase 闭包返回数据

java - 从 firebase 中检索没有标签的 child

javascript - 如何在 Web 应用程序中使用 Firebase 完成用户授权?

javascript - 从indexeddb分段加载数据

javascript - 如何在 ReactJS 中将对象插入数组

arrays - swift 数组方法 "starts(with:)"导致类型 "Range<Int>"的值没有数字 "starts"

javascript - 从underscorejs中的循环数组中删除项目