作者:zpcbb80569 | 来源:互联网 | 2023-05-26 15:14
我有一个应用程序,每5秒左右就会有新的孩子被添加到Firebase.我有成千上万的孩子.
在应用程序加载时,我想要处理最初的数千个,而不是每隔5秒钟处理一次的后续子节点.
您可能建议我使用值,处理所有内容,然后使用children_added.但我相信如果处理时间过长,我有可能错过一点.
有没有办法在Firebase中做到这一点,保证我不会错过任何一点?
1> jwngr..:
由于child_added
初始预加载数据的事件将在value
事件触发父事件之前触发,因此您可以将value
事件用作一种"初始数据加载"通知.这是我从另一个类似的StackOverflow问题稍微修改过的一些代码.
var initialDataLoaded = false;
var ref = new Firebase('https://.firebaseio.com');
ref.on('child_added', function(snapshot) {
if (initialDataLoaded) {
var msg = snapshot.val().msg;
// do something here
} else {
// we are ignoring this child since it is pre-existing data
}
});
ref.once('value', function(snapshot) {
initialDataLoaded = true;
});
值得庆幸的是,Firebase将智能地缓存此数据,这意味着创建一个child_added
和一个value
侦听器只会下载一次数据.为已经越过网线的数据添加新的Firebase监听器非常便宜,您应该习惯于经常做这样的事情.
如果您担心在实际不需要时下载所有初始数据,我会在评论中按照@ FrankvanPuffelen的建议使用带时间戳的查询.这非常有效,并使用Firebase查询进行了优化.
Firebase应该保证`value`事件会在任何*new*`child_added`事件触发之前触发,所以你应该没事.至于回调的数据处理,只要你立即检查`initialDataLoaded`变量就没关系.如果你在一堆阻塞代码之后在回调中检查它,它可能已切换到`true`,这是我认为你得到的.您应该遵循常用的Javascript最佳做法,因为这不是特定于Firebase的问题.