2016-08-16 13 views
1

我在js中有一個需要在從Firebase檢索數據後進行刷新的功能。檢索現有數據後的Firebase運行腳本

firebase.database().ref('/users/' + this.userId + '/info').on('child_added', function(snapshot){ 
    this.myFunction(); 
}.bind(this)); 

問題是,Firebase中的數據非常大,所以我不需要多次運行該功能。這是我如何運行:

  1. 從Firebase中檢索所有現有數據。
  2. 運行該功能(一次)。
  3. 每當更多數據從Firebase進來時,請再次運行該功能。

這可能嗎?

謝謝。

回答

1

Yevgen的答案是這樣做的一種方法。但這意味着您將在每次更改時處理所有的孩子,這可能不是您想要的。

另一種方法是使用value事件處理初始子項,然後使用child_事件處理後續更改。您可以保證在所有相關的child_事件之後value事件將觸發以檢測初始有效負載是否已完成。

var isInitialValueDone = false 

ref.once('value', function(snapshot) { 
    snapshot.forEach(function(child) { 
    console.log('Do something with '+child.key); 
    }); 
    isInitialValueDone = true; 
}); 
ref.on('child_added', function(snapshot) { 
    if (isInitialValueDone) { 
    console.log('Do something with '+snapshot.key); 
    } 
}); 
+0

剛剛將第一個'on'改爲'once' 。與您的答案我不需要重組我的數據佈局。 –

+0

ouch ...關於'once()'的好處。我已經更新了我的答案。 –

0

我猜你想要一次從firebase檢索所有現有數據,然後隨着更多數據進入監聽這些數據更改。如果這是你的情況看看方法一次()在firebase

+0

是的,但我很需要在一次完成後運行'開'功能。我怎麼做? –

2

是的,這是可能的。首先,您需要留空ref參數,以便從根節點獲取所有信息(所有數據)。它會在第一次觸發時默認運行,並且由於參數'value',將在任何數據更改時再次觸發。您可以使用child_added,child_changed,child_removed或child_moved來減少從Firebase接收數據的次數。例如:

firebase.database().ref().on('value', function(snapshot){ 
    myFunction(snapshot.val()); 
}; 

P.S.不要忘記使用snapshot.val()從快照中確切獲取數據。

+0

我喜歡這個,它的創意。所以我可以把我的節點放在另一個節點中,像這樣:firebase.database()。ref('/ users /'+ this.userId +'/ main/info') –