2015-06-26 22 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

同意。我們將跟蹤人們跑步的頻率。到目前爲止,你是我知道的第一個。我從未注意到今天之前的行爲,可能是因爲我非常專注於使用查詢來最小化到達客戶端的數據。 –

相關問題