Javascript 下班后还打电话吗?

Javascript 下班后还打电话吗?,javascript,firebase,Javascript,Firebase,我的情况是,即使我对引用调用off,它也会不断调用回调 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('of

我的情况是,即使我对引用调用
off
,它也会不断调用回调

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();
  }
});
var ref=new Firebase('https://stackoverflow.firebaseio.com/31069762');
对于(变量n=0;n<1024;++n){
参考推力(n)
}
参考on(“添加子项”),功能(快照){
如果(snapshot.val()>10){
console.log('off')//打印多次。
参考关闭();
}
});
当您调用
off()
时,它将停止Firebase客户端为传入的新数据触发
child\u添加的
事件。它不会阻止它为客户端已经收到的数据触发
child\u 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();
  }
});
当您注册侦听器时,ref的数据作为“一个初始数据包”下载,并从那里触发所有添加的
child\u事件

现在让我们改变一下代码:

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)
}
因此,通过这个命令,它会立即停止。因为我们在没有任何数据之前就开始监听
child\u added
,所以初始有效负载是空的,之后我们会将每个child作为一个单独的更新

请注意,这一切都取决于Firebase客户端的内部结构,我还没有检查它在那里的实际工作方式。所以我上面提到的“一个初始数据包”就是如何将其可视化

如果您真的不想在
10
之后处理数据,我可以考虑两种解决方案

  • 你已经做的一件事:保持一个本地的“我完成了”标志

  • 使用
    查询
    限制Firebase下载的数据,而不是筛选客户端:

    ref.orderByValue().endAt(10).on('child_added'...
    
    请注意,
    orderByValue
    是在Firebase JavaScript SDK的2.2.7版中引入的。我花了一段时间才弄明白为什么我不能在JSBin中使用它-/


  • ss
    是一个
    事件,那么
    ss.val().end
    应该是什么呢?@Barmar:它只是一个值。它与问题有什么关系?
    Event
    没有
    val()
    方法,因此它在尝试调用
    ss.val()
    时应该会出错。这将阻止执行
    segmentsRef.off()
    。@Barmar:说得好。但是,ss不是
    事件
    而是
    快照
    请参见:
    segmentsRef.off()
    被调用。啊,我以为那是jQuery
    。on()
    ,我不知道Firebase也有这样一个方法。好的。这可能应该记录在某个地方。特别是因为所有其他事件API保证在“off/removeEventListener”之后不会再次调用回调。同意。我们将跟踪人们多久会遇到这种情况。到目前为止,你是我第一个知道的人。在今天之前,我绝对没有注意到这种行为,可能是因为我非常专注于使用查询来最小化到达客户的数据。
    1
    2
    .
    .
    .
    11
    "off"
    
    ref.orderByValue().endAt(10).on('child_added'...