Man*_*ndM 6 javascript firebase
我有一个应用程序,我想在其中加载一些初始数据(完成Firebase.once('value')),然后在某个时候我想要接收已添加到该Firebase引用的子节点的事件.
为此,我想使用Firebase.on('child_added'),但根据定义(并在实践中看到),它首先加载Firebase引用的所有数据.
有没有办法解决这种行为,只监听child_added事件.此外,像转储初始数据集这样的解决方法不是解决方案(想象一下拥有超过一百万个数据点的数据集 - 我不希望每个数据点都只是为了在添加一个数据点时进行监听!).
编辑:Firebase.on('child_added')可以结合使用limit()来限制初始请求产生的数据量.可能对我的应用程序来说,在某个时间点只会向Firebase添加一个数据点,因此我使用了Firebase.limit(1).on('child_added')哪个数据点来限制加载到单个数据点的初始数据量.但是,我不喜欢这种解决方法有两个原因:
limit(1)限制应用程序接收所有添加的子项?我不确定是否是这种情况,或者是否child_added会为每个添加的孩子调用,无论他们是否作为批次添加.似乎提供一个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());
}
});
});
Run Code Online (Sandbox Code Playgroud)
使用优先级标记旧记录的时间戳
写记录时,使用setWithPriority:
fb.child('records/$recordid').setWithPriority(data, Firebase.ServerValue.TIMESTAMP);
Run Code Online (Sandbox Code Playgroud)
现在您可以阅读从"now"开始的记录:
fb.child('records').startAt(Date.now()).on('child_added', function(snap) {
console.log('new child', snap.name());
});
Run Code Online (Sandbox Code Playgroud)
请注意这里使用时间戳的一个警告.我在startAt()命令中使用了Date.now(),因为它当前不支持Firebase.ServerValue.TIMESTAMP(为此提交的bug).
| 归档时间: |
|
| 查看次数: |
4630 次 |
| 最近记录: |