我有一个大型数据集(~100k条目),正在使用' child_added'进行订阅。事件。使用节点7和firebase 3.6.1,执行此操作似乎在单个child_added事件被触发之前下载整个100k条目。
内存消耗在几十秒内显着增长,然后所有child_added事件都会在彼此之后迅速发生。
这很慢:
require('firebase').
initializeApp({databaseURL: 'https://someproject.firebaseio.com'}).
database().ref('data').
on('child_added', (snap) => console.log(snap.key));
限制仍然很快(延迟几秒):
require('firebase').
initializeApp({databaseURL: 'https://someproject.firebaseio.com'}).
database().ref('data').limitToFirst(10).
on('child_added', (snap) => console.log(snap.key));
鉴于Firebase的流媒体特性,我认为在完成任何事情之前,child_added订阅并不打算将整个数据集下载到客户端。
我做错了什么,或者这是一个错误?
答案 0 :(得分:1)
虽然从firebase documentation中提取的 child_added 部分中的内容显示:
在该页面中通常在从数据库中检索项目列表时使用 child_added 事件。与返回位置的整个内容的值不同,child_added为每个现有子项触发一次,然后每次将新子项添加到指定路径时再次触发。事件回调传递包含新子数据的快照。出于订购目的,它还传递包含前一个子项的键的第二个参数。
At the first lines,我们可以找到:
通过将异步侦听器附加到数据库引用来检索存储在Firebase实时数据库中的数据。 对于数据的初始状态,监听器将被触发一次,并且在数据发生变化时,将再次触发监听器。
似乎是它的正常行为。它首先检索所有数据。
答案 1 :(得分:1)
我处于相同的情况,等待将近40秒让第一个孩子开火。我能想到的唯一解决方案是使用Firebase rest API和浅层查询参数获取密钥,然后遍历每个密钥并调用Firebase。这基本上就是我做的。
`
console.log('start', Date.now());
fetch('https://[firebase_app].firebaseio.com/[your_path].json?shallow=true')
.then((response) => {
return response.json();
}).then(function(j) {
Object.keys(j).forEach(function (key) {
console.log(key, 'start', Date.now());
firebase_reference.child(key).on("child_added", function (snapshot) {
console.log(key, Date.now());
//now you have the first response without waiting for everything.
});
});
});`
我知道这并没有回答你关于child_added功能的问题,但它可以实现你对child_added的期望。我将向Firebase提交功能请求并链接此SO问题。