I have a situation where even if I call off
on a reference it keeps calling the callbacks?
var ref = new Firebase('https://stackoverflow.firebaseio.com/31069762');
for (var n = 0; n < 1024; ++n) {
ref.push(n)
}
ref.on('child_added', function(snapshot) {
if (snapshot.val() > 10) {
console.log('off') // Printed multiple times.
ref.off();
}
});
答案 0 :(得分:2)
当您致电off()
时,它会阻止Firebase客户端针对新数据触发child_added
事件。它不会阻止它为客户端已发送数据child_added
事件接收。
你可以通过这种方式获得一些有趣的行为。例如,您的代码段:
var ref = new Firebase('https://stackoverflow.firebaseio.com/31069762');
ref.remove();
for (var n = 0; n < 1024; ++n) {
ref.push(n)
}
ref.on('child_added', function(snapshot) {
console.log(snapshot.val());
if (snapshot.val() > 10) {
console.log('off') // Printed multiple times.
ref.off();
}
});
将打印:
1
2
.
.
.
11
"off"
12
"off"
.
.
.
1024
"off"
当您注册监听器时,您的ref的数据将作为“一个初始数据包”下载,并在所有child_added
事件被触发时从那里开始。
现在让我们改变代码:
var ref = new Firebase('https://stackoverflow.firebaseio.com/31069762');
ref.remove();
ref.on('child_added', function(snapshot) {
console.log(snapshot.val());
if (snapshot.val() > 10) {
console.log('off') // Printed multiple times.
ref.off();
}
});
for (var n = 0; n < 1024; ++n) {
ref.push(n)
}
所以在这种情况下,我们首先注册监听器,然后才开始推送值。输出:
1
2
.
.
.
11
"off"
因此,通过这种排序,它会立即停止。由于我们在有任何数据之前就开始侦听child_added
,因此初始有效负载是空的,我们将每个子进程作为单独的更新。
请注意,这一切都取决于Firebase客户端的内部,我还没有检查它在那里的实际工作情况。所以我上面提到的“一个初始数据包”就是我可视化的方式。
如果你真的不想在10
之后处理数据,我可以考虑两种解决方案。
你已经做过的那个:保持一个当地的“我已经完成”的旗帜
使用Query
限制Firebase下载的数据,而不是过滤客户端:
ref.orderByValue().endAt(10).on('child_added'...
请注意,orderByValue
是在Firebase JavaScript SDK 2.2.7版中引入的。我花了一段时间才弄清楚为什么我不能在JSBin中使用它。 : - /