【问题标题】:First finish reading data from Firebase and then do something else首先完成从 Firebase 读取数据,然后执行其他操作
【发布时间】:2017-07-26 22:40:21
【问题描述】:

所以我的问题是返回空数组,因为从 Firebase 读取数据尚未完成。我正在使用 then 方法,但它仍然执行 then 之前的所有内容。

var usersList = [];

const ref = firebase.database().ref()

ref.child('users').once('value').then(snap => {

    snap.forEach(childSnap => {

        const key = childSnap.key

        ref.child(`users/${key}/points`).on('value', function(snapper) {

            var points = snapper.val()

            usersList.push({uid: key, points: points})

        })

    })

}).then(function() {
    console.log(usersList)
})

【问题讨论】:

    标签: javascript arrays firebase firebase-realtime-database


    【解决方案1】:

    使用then() 本身并不是一个神奇的解决方案。您需要从回调中返回一个承诺,而您的代码没有这样做。在这种情况下,您只希望在加载所有用户后调用最终的 then(),因此您需要返回一个仅在完成后才解析的 Promise。

    const ref = firebase.database().ref()
    
    ref.child('users').once('value').then(snap => {
        var promises = [];
    
        snap.forEach(childSnap => {
            const key = childSnap.key
            promises.push(
                ref.child(`users/${key}/points`).once('value')
            );
        });
    
        return Promise.all(promises);
    }).then(function(snapshots) {
        return snapshots.map(snapper => {
           var points = snapper.val()
           return {uid: key, points: points};
        })
    }).then(function(usersList) {
        console.log(usersList)
    })
    

    【讨论】:

    • 这行好像无效:return Promise.all(promises);
    • 你能解释一下它的无效之处吗?
    • 这是一个语法错误,")" 在此行之前丢失。
    • 不过我在运行我的脚本后收到此错误消息:(node:14560) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): ReferenceError: key is not defined
    猜你喜欢
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    相关资源
    最近更新 更多