gpt4 book ai didi

javascript - Firebase child_added 没有先加载所有数据

转载 作者:数据小太阳 更新时间:2023-10-29 05:22:55 24 4
gpt4 key购买 nike

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

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

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

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

  1. 这仍然是一种解决方法。我仍然不得不忽略我不应该担心忽略的数据。
  2. 如果出于某种原因我的应用程序的性质要改变并且我要一次将多个子项添加到 Firebase 引用中 - 将强加 limit(1) 限制应用程序接收所有加了 child ?我不确定是否是这种情况,或者是否会为添加的每个单独的 child 调用 child_added,无论它们是否作为批处理添加。

似乎提供一个 true/false 标志作为调用的参数是一个不错的解决方案,但我会等着看是否有我一直在掩盖的答案。 .

最佳答案

删除旧消息

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

如果你想维护这个模型,有几个不错的选择:

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

您甚至可以将 key 存储在 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);

现在您可以阅读从“现在”开始的记录:

fb.child('records').startAt(Date.now()).on('child_added', function(snap) {
console.log('new child', snap.name());
});

请注意此处使用时间戳的一个注意事项。我在 startAt() 命令中使用了 Date.now(),因为它目前不支持 Firebase.ServerValue.TIMESTAMP(为此提交了错误)。

关于javascript - Firebase child_added 没有先加载所有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24312783/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com