2016-08-16 12 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') –