2015-06-26 23 views
1

我有一种情况,即使我打电话给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(); 
    } 
}); 
+0

'ss'是一个'Event',那么什么是'ss.val()。end'应该是什么? – Barmar

+0

@Barmar:这只是一个价值。这与问题有什么关系? – ronag

+0

'Event'没有'val()'方法,因此它在尝试调用'ss.val()'时应该会出错。这将阻止'segmentsRef.off()'完成。 – Barmar

回答

2

当你调用off()它将从烧制附带在新的数据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" 

您参考的数据下载,当您注册的所有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来限制数据火力地堡下载,而不是过滤客户端:

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

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

+0

好的。这可能应该记录在某个地方。特别是因为所有其他事件API都保证在'off/removeEventListener'之后不会再次调用回调。 – ronag

+0

同意。我们将跟踪人们跑步的频率。到目前为止,你是我知道的第一个。我从未注意到今天之前的行为,可能是因为我非常专注于使用查询来最小化到达客户端的数据。 –

相关问题