所以我的问题是返回空数组,因为从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)
})
答案 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)
})