为什么Firebase活动' child_added'在'值之后开火事件?

时间:2015-11-04 07:47:40

标签: javascript firebase

根据Firebase documentation

  

值事件总是最后触发,并且保证包含在拍摄快照之前发生的任何其他事件的更新。

以下是一个简单示例(jsbin),其中child_addedvalue之前触发。使用当前最新的Firebase版本(2.3.1)确认了此行为:

var ref = new Firebase("https://reform.firebaseio.com");
ref.child('pets').once('value', function(snapshot) {

    snapshot.forEach(function(pet) {
        console.log("Pet: " + pet.key());

        pet.ref().child('food').once('value', function (foods) {
            console.log('value event called for ' + pet.key());
        });

        pet.ref().child('food').once('child_added', function (foods) {
            console.log('child_added event called for ' + pet.key());
        });
    });
});

在此示例中,控制台日志将为:

Pet: cat
Pet: dog
value event called for cat
child_added event called for cat
value event called for dog
child_added event called for dog

为什么child_added事件会在这种情况下持续发生?这是否违反了文件的保证?

1 个答案:

答案 0 :(得分:1)

总结评论和Firebase支持中的出色反馈:

  1. 这里最有意义的是使用on()而不是once()来注册事件监听器。在example of the original post中,引用Firebase支持:

      

    注册了on()回调,并且当注册了once()回调时,它会在引用on()回调时被排序。一旦触发了once()回调,它就会自动取消注册。即使事件的执行按特定顺序完成(由于javascript是单线程的),它们也是彼此分开计算的。

    Frank's correction to that example显示了这一点。

  2. 修改后的例子再次破坏了"保证"因为(Firebase支持):

      

    数据已在客户端本地。因此,一旦您运行了ref.child(' pets')on()并且回调发生,/ pets下的所有数据都已被检索到客户端。现在,在回调处理中,您将向现有数据添加其他回调。当添加回调时,客户端库会立即触发回调而不等待第二个回调,因为所有数据都可用。

    由于我想在数据为本地的情况下强制执行保证,我只需在child_added侦听器之前注册value侦听器,如correction to the modified example所示。< / p>