根据Firebase documentation:
值事件总是最后触发,并且保证包含在拍摄快照之前发生的任何其他事件的更新。
以下是一个简单示例(jsbin),其中child_added
在 value
之前触发。使用当前最新的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
事件会在这种情况下持续发生?这是否违反了文件的保证?
答案 0 :(得分:1)
总结评论和Firebase支持中的出色反馈:
这里最有意义的是使用on()
而不是once()
来注册事件监听器。在example of the original post中,引用Firebase支持:
注册了on()回调,并且当注册了once()回调时,它会在引用on()回调时被排序。一旦触发了once()回调,它就会自动取消注册。即使事件的执行按特定顺序完成(由于javascript是单线程的),它们也是彼此分开计算的。
修改后的例子再次破坏了"保证"因为(Firebase支持):
数据已在客户端本地。因此,一旦您运行了ref.child(' pets')on()并且回调发生,/ pets下的所有数据都已被检索到客户端。现在,在回调处理中,您将向现有数据添加其他回调。当添加回调时,客户端库会立即触发回调而不等待第二个回调,因为所有数据都可用。
由于我想在数据为本地的情况下强制执行保证,我只需在child_added
侦听器之前注册value
侦听器,如correction to the modified example所示。< / p>