使用以下方式收听“child_added”事件时
ref.on("child_added", function (snapshot) {
});
对于参考中存在的每个子项,此回调函数最初将运行一次。
此事件将在此位置为每个初始孩子触发一次,每次添加新孩子时都会再次触发。
https://firebase.google.com/docs/reference/node/firebase.database.Reference
我想利用这个事实和排序函数来构造有序数组:
orderedArray = [];
ref.orderByValue("rating").on("child_added", function (snapshot) {
orderedArray.push(snapshot.val())
});
// how do I run a callback after the last child has been added?
然而,(据我所知)没有办法告诉最后一次调用child_added
回调,因此在最后一个孩子被添加到我的后,我无法准确地运行自己的回调阵列。
这是我现在的解决方法:
orderedArray = [];
ref.orderByValue("rating").on("child_added", function (snapshot) {
orderedArray.push(snapshot.val())
});
setTimeout(function() {
ref.off("child_added") // unbind event
callback()
}, 3000)
这非常粗略,特别是在从数据库中获取所有数据需要3秒多的时间。
这里有什么想法吗?
答案 0 :(得分:12)
您可以迭代父快照,并使用DataSnapshot.forEach
:
const ref = firebase.database().ref().child('items');
const items = [];
ref.once('value', snap => {
snap.forEach(item => { items.push(item) });
console.log(items);
});
由于您正在调用ref.off()
一次读取数据,因此使用.once()
方法并迭代父快照是有意义的。
答案 1 :(得分:0)
我想做的是使用observeSingleEvent
侦听器。
// Following a Swift code but the logic remains same.
Database.database()
.reference(withPath: "The_Path")
.observeSingleEvent(of: .value) { (snapshot) in
// Iterate and save the values from the snapshot.
// Now initiate `childAdded` and `childChanged` listeners.
self.keepObserving()
}
并在完成后添加childAdded
和childChanged
。
func keepObserving() {
Database.database()
.reference(withPath: "The_Path")
.observe(.childAdded) { (snapshot) in
// Check if the value in the snapshot exists in the your array or data model.
// If not then add it to your container else return.
}
Database.database()
.reference(withPath: "The_Path")
.observe(.childChanged) { (snapshot) in
// Find the indexOf the data in snapshot in array or container.
// If the index is found or exist replace the changed value.
}
}