JavaScript数组不可迭代

时间:2017-10-25 10:28:52

标签: 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)
            })
        }

    });

以上代码应该从每个用户的timeline获取数据,遍历posts上的每个timeline,然后从{获取帖子的数据{1}}。然后它只是将数据推送到posts数组,该数组最后是控制台记录。

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

在扩展数组之前,控制台不会显示数组中的项目。另外,当我尝试获取数组的statuses时,它返回0并且我也无法遍历数组中的项目。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

如果帖子是可迭代的,我会考虑使用某个版本的q.all然后当所有的promise都被解析时,你可以可靠地将所有这些片段的结果记录到状态数组中。

一些伪代码:

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));
    }