Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 添加Firebase子项时未首先加载所有数据_Javascript_Firebase - Fatal编程技术网

Javascript 添加Firebase子项时未首先加载所有数据

Javascript 添加Firebase子项时未首先加载所有数据,javascript,firebase,Javascript,Firebase,我有一个应用程序,我想在其中加载一些初始数据(通过Firebase.one('value')),然后在稍后的某个时候,我想接收添加到该Firebase引用的子节点的事件 为此,我想使用Firebase.on('child_added'),但根据定义(在实践中可以看到),它首先加载该Firebase引用处的所有数据 有没有办法绕过这种行为,只监听添加的child\u事件。此外,像转储初始数据集这样的变通方法也不是解决方案(想象一下,一个数据集有超过一百万个数据点——我不想为了在添加数据点时监听每个

我有一个应用程序,我想在其中加载一些初始数据(通过
Firebase.one('value')
),然后在稍后的某个时候,我想接收添加到该Firebase引用的子节点的事件

为此,我想使用
Firebase.on('child_added')
,但根据定义(在实践中可以看到),它首先加载该Firebase引用处的所有数据

有没有办法绕过这种行为,只监听添加的
child\u
事件。此外,像转储初始数据集这样的变通方法也不是解决方案(想象一下,一个数据集有超过一百万个数据点——我不想为了在添加数据点时监听每个数据点!)

编辑:
Firebase.on('child_added')
可以与
limit()
组合,以限制来自初始请求的数据量。可能对于我的应用程序,一个时间点只会向Firebase添加一个数据点,因此我使用了
Firebase.limit(1).on('child_added')
,它限制加载到单个数据点的初始数据量。但是,我不喜欢这种变通方法,原因有二:

  • 这仍然是一个解决办法。我仍然不得不忽略那些我不必担心忽略的数据
  • 如果出于某种原因,我的应用程序的性质发生了变化,并且我一次向Firebase引用添加了多个子项,那么施加
    限制(1)
    会限制应用程序接收所有添加的子项吗?我不确定情况是否如此,或者添加的每个孩子是否会被调用
    child\u
    ,无论他们是否作为一个批次添加

  • 似乎提供一个
    true/false
    标志作为调用的参数将是一个很好的解决方案,但我会等待,看看是否有我一直在掩盖的答案…

    删除旧消息

    如果您对历史数据不感兴趣,那么可以将其用作消息队列。如果是这种情况,则在读取旧记录后,应将其删除(或归档到备用路径)。这样,问题就可以自行解决

    如果要维护此模型,可以使用以下几个好选项:

    存储读取的最后一个键,并将其用作下一次加载的起点

    你甚至可以把钥匙存放在Firebase里

    var fb = new Firebase(URL);
    fb.child('last_read_key').once('value', function(lastReadSnap) {
       var lastKey = lastReadSnap.val();
       var pri = lastReadSnap.getPriority();
       fb.child('data_to_read').startAt(pri, lastKey).on('child_added', function(snap) {
          if( snap.name() !== lastKey ) {
             console.log('new record', snap.name());
             fb.child('last_read_key').setWithPriority(snap.name(), snap.getPriority());
          }
       });
    });
    
    使用优先级标记旧记录的时间戳

    写入记录时,请使用setWithPriority:

    fb.child('records/$recordid').setWithPriority(data, Firebase.ServerValue.TIMESTAMP);
    
    现在您可以从“现在”开始读取记录:


    注意这里使用时间戳的一个警告。我在startAt()命令中使用了Date.now(),因为它目前不支持Firebase.ServerValue.TIMESTAMP(此错误已存档)。

    您可以将创建时间戳添加到每个数据集,并将当前时间戳用作
    startAt
    查询这将与当前的结构方式——数据的“键”配合使用(键:val格式)是数据的时间戳。感谢您提供的信息!
    fb.child('records').startAt(Date.now()).on('child_added', function(snap) {
        console.log('new child', snap.name());
    });