首先完成从Firebase读取数据,然后执行其他操作

时间:2017-07-25 12:47:34

标签: javascript arrays firebase firebase-realtime-database

所以我的问题是返回空数组,因为从Firebase读取数据尚未完成。我正在使用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)
})

1 个答案:

答案 0 :(得分:0)

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

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