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')
,它限制加载到单个数据点的初始数据量。但是,我不喜欢这种变通方法,原因有二:
限制(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());
});