child_removed并不总是在firebase上开火

时间:2016-08-02 00:06:59

标签: javascript firebase firebase-realtime-database

我在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侦听器时是否存在竞争条件?

1 个答案:

答案 0 :(得分:0)

我认为你不需要任何回调。代码应该非常简单。

Retrieve Data on the Web

  

当直接孩子出现时,会触发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);
});