以下是该场景:我从firebaseRef_1
(使用.once
回调)获取Firebase的初始有效负载(例如,5个对象)。然后我将每个收到的对象转换为新的Firebase引用。新生成的ref看起来像这样:
"data/ccccyyyyotKKiWC2xaV1WZ7H3/things/-KgXo121225H9_Nks1O"
例如,如果我在.once
电话上有5个传入对象,那么我将创建5个参考号(参见下面的代码段)。
一旦我创建/生成了我想要的参考文献:
a)为这5个引用中的每一个创建一个.on监听器。
b)如果(让我们说)一段时间之后1' row'新数据到达firebaseRef_1
,我想生成一个新的参考,然后创建一个监听器 - 但现在,仅用于新添加的项。否则,如果我尝试遍历所有(现在为6个)元素,Firebase会抛出一个promise错误,告诉我原来的5个元素(refs)已经附加了一个监听器。
我最初考虑使用.once
调用的原因是,我可以获得整个有效负载#34;所有这些都在.once
" (双关语!),它可以更快地填充ListView
(反应原生)。我尝试使用.child_added
方法,但在初始加载(这5行)中,.child_added
被调用了5次,因此您可以看到这些行逐个出现我不喜欢的ListView。
我应该如何在代码中最好地构建它以实现我上面描述的内容?我应该像这样进行.once
调用:
generateTheRefs() {
firebase.database()
.ref('data/' + firebaseUID + '/initialPath')
.once('value', (snapshot) => {
snapshot.forEach(childSnapshot => {
var childData = childSnapshot.val();
let path = `data/${childData.item1}/things/${childData.item2}`;
//now create a .on listener
firebase.database()
.ref(path)
.on('value', (snapshot) => {
//....
});
});
});
}
答案 0 :(得分:0)
你可以:
答案 1 :(得分:0)
听起来你所追求的是同时使用所有结果,所以他们不会随着时间的推移而运球。您可以使用Promises数组和Promise.all()在使用之前等待它们全部到达,例如:
function generateTheRefs() {
firebase.database()
.ref('data/' + firebaseUID + '/initialPath')
.once('value', (snapshot) => {
let promises = [];
snapshot.forEach(childSnapshot => {
var childData = childSnapshot.val();
let path = `data/${childData.item1}/things/${childData.item2}`;
//now create a .on listener
promises.push(firebase.database()
.ref(path)
.once('value'));
});
Promise.all(promises).then(snaps => {
snaps.forEach(snap => {
// ...
console.log(snap.val());
})
});
});
}