【问题标题】:When does the loading of data occur in Firebase?Firebase 中何时加载数据?
【发布时间】:2025-11-25 04:20:19
【问题描述】:

我的数据按日期和增量 ID 排序,如下所示:

  • 20140622
    • value_1
    • value_2
  • 20140623
    • value_3
    • value_4

为了检测何时添加了新日期,我设置了一个 on('child_added') 侦听器,然后设置了另一个 on('child_added') 侦听器来检测该日期内的新值,因为 on('child_added') 是只为直接子级触发。

为了避免双重带宽使用并加快加载速度,我想知道该快照的所有数据的传输发生在哪个时刻:当我定义新的孩子或当我使用 .val( ) 函数?

【问题讨论】:

    标签: javascript firebase


    【解决方案1】:

    当您使用 on() 或 once() 建立侦听器时会下载数据,并在本地缓存并保持同步,直到所有侦听器断开连接。

    通常不需要为嵌套的子级建立child_added 侦听器,因为它们已经存在于作为父级的一部分下载的数据中:

    var ref = new Firebase(URL);
    ref.on('child_added', function(snap) {
       console.log('parent rec', snap.name());
       snap.forEach(function(childSnap) {
          console.log('child rec', childSnap.name());
       });
    });
    

    不过,嵌套的child_added 事件也没有什么坏处;这一切都由 Firebase 在内部进行了优化,这些值将立即从本地缓存的数据中返回:

    var ref = new Firebase(URL);
    ref.on('child_added', function(snap) {
       console.log('parent rec', snap.name());
       snap.ref().on('child_added', function(snap) {
          console.log('child rec', snap.nam());
       });
    });
    

    这里唯一需要注意的是,如果您想稍后在这些事件侦听器上调用 off(),则必须在断开服务器连接并清除所有缓存数据之前将它们全部断开。

    【讨论】:

    • 实际上,为了避免 off() 调用出现这个问题,我正在做的是定义两个“on”侦听器,但不是嵌套的:fb1=new Firebase('https://XXX.firebaseio.com/20140623/'); fb2=new Firebase('https://XXX.firebaseio.com/20140623/value_3'); Firebase 也会对此进行优化吗?跨度>
    • 也进行了优化。数据集被缓存一次并在本地使用,根据需要从服务器应用增量。