2014-10-01 28 views
2

我想使用once方法從Firebase ref檢索數據,但沒有收到快照中的任何數據。 下面是簡單的數據檢索:使用`once`回調檢索Firebase值使用事務

編輯後進一步檢查,我發現了一個事務正在once值聽者後不久調度。 (爲了簡單起見,我將收聽該代碼例如後放置交易直接。)

dataRef.once('value', function (snapshot) { 
    snapshot.val(); // returns `null` 
}); 

dataRef.transaction(function (currentValue) { 
    if (currentValue) { 
    // make changes 
    } 
    return currentValue; 
}); 

有一個在此火力REF數據。爲了驗證,我嘗試使用on而不是once。在這種情況下,回調會被調用兩次:

dataRef.on('value', function (snapshot) { 
    snapshot.val(); // returns `null` first, then called again and returns correct value 
}); 

是什麼導致了這種行爲?我希望快照在第一次調用回調時具有正確的值。否則,once方法沒有用處。

+1

我用'once'很多次,要知道,它**可以**工作。很可能你正在做一些不同的事情,不幸的是,這些代碼片段很難說清楚。你可以在你的問題(點擊'編輯',然後'代碼片段')或jsfiddle/jsbin中提供問題的最小複製? – 2014-10-02 01:38:39

+1

我也曾經使用過一次,至少......犯錯一次,取得了一些成功;數以千計的開發人員和數十名非常突出的企業客戶也都這樣做了。 – Kato 2014-10-02 16:20:41

+0

感謝您的理智檢查,您是對的,有其他事情正在進行。經過更多的挖掘和檢查之後,我發現一筆交易正在計劃在'曾經'價值監聽者之後不久。我將更新原始問題以反映新信息。 – Brad 2014-10-02 20:41:16

回答

2

Firebase docs對於transaction有第三個參數applyLocally

默認情況下,每次運行事務更新函數時都會引發事件。所以如果它運行多次,你可能會看到中間狀態。您可以將其設置爲false以禁止這些中間狀態,而是在引發事件之前等待事務完成。

因爲這個默認值,該值once聽者在激發交易在本地運行後的第一時間,即使沒有數據從服務器檢索(通過null作爲交易的currentValue)。通過傳遞falseapplyLocally參數,抑制這種局部事件和數據已經從服務器檢索後once回調只會被調用:

dataRef.transaction(function (currentValue) { 
    if (currentValue) { 
    // make changes 
    } 
    return currentValue; 
}, 
function(){}, 
false); 
+0

有趣的角落案件。讓我再次感到高興,我不經常使用'once'。我建議在大多數情況下使用'on'。當您使用Firebase時,您必須從「這是我加載數據的位置」切換到「我的數據不斷同步並因此可以隨時出現」的心態。您正在*看*一個「活的」數據結構,而不是從靜態的*加載*。 – 2014-10-03 18:04:58

+0

是的,這很有趣,我很高興有一個解釋我正在經歷的行爲。感謝您的提示。 – Brad 2014-10-03 22:03:58