callback called even after off?

时间:2015-06-26 09:36:33

标签: javascript firebase

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();
  }
});

1 个答案:

答案 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之后处理数据,我可以考虑两种解决方案。

  1. 你已经做过的那个:保持一个当地的“我已经完成”的旗帜

  2. 使用Query限制Firebase下载的数据,而不是过滤客户端:

    ref.orderByValue().endAt(10).on('child_added'...
    

    请注意,orderByValue是在Firebase JavaScript SDK 2.2.7版中引入的。我花了一段时间才弄清楚为什么我不能在JSBin中使用它。 : - /