我在firebase中运行了两个测试。一个版本通过,另一个版本不通过。如果在实际添加子项之前附加了child_removed回调,则它可以正常工作。插入后连接时不会触发。
通过测试的版本:
it("A) listens to child_removed raw (Before Insert)", function (done) {
this.timeout(5000);
let ref = DataServices.database.ref();
let pushRef = ref.child('test/testChildRemovedA').push();
let newKey = pushRef.key;
let insertPath = 'test/testChildRemovedA/' + newKey;
let callback = (snapshot) => { done(); }
DataServices.database.ref('test/testChildRemovedA/').on("child_removed", callback);
let updates = {};
updates[insertPath] = 'hi';
DataServices.database.ref().update(updates).then(() => {
updates[insertPath] = null;
DataServices.database.ref().update(updates);
});
});
未通过测试的版本:
it("B) listens to child_removed raw (After Insert)", function (done) {
this.timeout(10000);
let ref = DataServices.database.ref();
let pushRef = ref.child('test/testChildRemovedB').push();
let newKey = pushRef.key;
let insertPath = 'test/testChildRemovedB/' + newKey;
let callback = (snapshot) => { done(); }
let updates = {};
updates[insertPath] = 'hi';
DataServices.database.ref().update(updates).then(() => {
DataServices.database.ref('test/testChildRemovedB/').on("child_removed", callback);
updates[insertPath] = null;
DataServices.database.ref().update(updates);
});
});
唯一的区别是附加了child_removed事件,但在实际删除数据之前都附加了这两个事件。在这两种情况下,确实从firebase中删除了数据。
添加child_removed侦听器时是否存在竞争条件?
答案 0 :(得分:0)
我认为你不需要任何回调。代码应该非常简单。
当直接孩子出现时,会触发
child_removed
事件 除去。它通常与child_added和。一起使用 child_changed事件。传递给事件事件的快照包含 被移除的孩子的数据。每次子节点都会触发
child_changed
事件 改性。这包括对孩子后代的任何修改 节点。它通常与child_added和。一起使用 child_removed事件以响应对项目列表的更改。该 传递给事件侦听器的快照包含更新的数据 孩子。var commentsRef = firebase.database().ref('post-comments/' + postId); commentsRef.on('child_added', function(data) { addCommentElement(postElement, data.key, data.val().text, data.val().author); }); commentsRef.on('child_changed', function(data) { setCommentValues(postElement, data.key, data.val().text, data.val().author); }); commentsRef.on('child_removed', function(data) { deleteComment(postElement, data.key); });