Firebase Realtime Database profiler统计list调用次数翻倍问题咨询
问题原因
这是AngularFire封装的Realtime Database API的内部行为导致的统计差异,不会产生额外的带宽消耗,也不代表你的代码重复触发了查询:
- RTDB Profiler统计的是SDK层面的数据读取操作次数,不是实际网络请求次数。
- 调用
db.object().valueChanges()时,SDK仅需一次读取即可拿到指定路径的完整JSON对象,所以统计计数为1,和你的日志输出一致。 - 调用
db.list().valueChanges()时,AngularFire为了将路径下的子节点自动拼装为数组格式,会在SDK内部执行两次读取操作:第一次读取完整路径快照判断子节点结构与排序规则,第二次遍历子节点提取值组装数组,两次操作都被计入Profiler的读取计数,所以显示为2,但实际仅发起一次网络请求,因此你只会收到一次订阅回调。
你可以通过浏览器开发者工具的Network标签页查看WebSocket请求,确认list调用也只会产生一次数据拉取报文,不会额外消耗带宽配额。
解决方案
如果需要避免Profiler的计数翻倍,可以选择两种改造方式:
- 直接用
object接口读取路径,自行转换数组格式
this.db.object(`/blogs/Birdee`).valueChanges().pipe(take(1)).subscribe(data => { const listResult = data ? Object.values(data) : []; // 后续业务逻辑 });
- 用
snapshotChanges()替代valueChanges(),自行处理快照转数组逻辑
如果需要用到list的查询能力(如orderByChild、limitToFirst等),可以用该方法避免内部二次读取:
this.db.list(`/blogs/Birdee`).snapshotChanges().pipe( take(1), map(snapshots => snapshots.map(item => item.payload.val())) ).subscribe(listResult => { // 后续业务逻辑 });
内容的提问来源于stack exchange,提问作者Zizazorro
相关产品推荐
相关产品推荐

