【问题标题】:JavaScript array not iterableJavaScript 数组不可迭代
【发布时间】:2018-04-06 09:36:53
【问题描述】:

昨晚我在一个简单的 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获取数据,遍历timeline上的每个posts,然后从posts获取帖子的数据。然后它只是将数据推送到statuses 数组,该数组在最后被控制台记录。

这就是控制台上显示的内容。

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

我做错了什么?

【问题讨论】:

  • 99/100 JS 错误似乎是异步问题 - 这看起来一样。您无法在控制台中登录由异步调用填充的数组。
  • 您不应该使用 for..in 构造迭代数组。使用Array.prototype.forEach()

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


【解决方案1】:

如果帖子是可迭代的,我会考虑使用某个版本的 q.all,然后当所有承诺都解决后,您可以可靠地将所有这些部分推送到状态数组中的结果记录下来。

一些伪代码:

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

【讨论】:

  • 这将如何工作?我对此有点陌生,所以如果你能给我举个例子,那将非常有帮助
  • 好了...看来我们有 Promises.all 可以使用 -> developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 非常感谢!
  • 我还为您的代码添加了一些 es6 化,使用模板字符串、箭头函数、自动返回语句使其更加性感;)
  • 整洁的东西!再次感谢:)
猜你喜欢
  • 2015-03-14
  • 2021-06-05
  • 1970-01-01
  • 2021-05-20
  • 2017-03-29
  • 2019-02-27
  • 2017-12-17
  • 2018-05-14
  • 1970-01-01
相关资源
最近更新 更多