Firebase:如何在所有初始“child_added”调用之后运行回调?

时间:2016-06-14 09:53:28

标签: javascript firebase firebase-realtime-database

使用以下方式收听“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秒多的时间。

这里有什么想法吗?

2 个答案:

答案 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()
}

并在完成后添加childAddedchildChanged

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