【发布时间】:2021-10-07 10:26:17
【问题描述】:
我正在使用Firebase 并订阅snapshotChanges 以在我的实时数据库更新时检索更新。
Service A 正在订阅观察者。 Service B 将 100 个项目写入实时数据库,如下所示:
const objs = {'fooA': valueA, 'fooB': valueB, ... };
const dbRef = firebase.database().ref(`projects/${project}`);
return dbRef.transaction((transaction) => {
return objs;
}, undefined, false);
如您所见,objs 可能包含数百个项目。事务执行后,我会在 Service A 中收到其他服务添加到数据库中的每个项目的更新。
由于我使用了一笔交易,我希望我也只收到 1 个回调,而不是 100 个。目前,我使用延迟计时器帮助自己,但我更愿意避免这种情况。
this.observer$ = this.db.list(`projects/${project}/`).snapshotChanges()
.pipe(auditTime(200))
.subscribe((data) => {
console.log(data);
});
输出auditItem:
(100) [{…}, {…}, {…}, {…}, …]
...
没有auditItem的输出:
(0) []
(1) [{…}]
> 0:{payload: DataSnapshot, type: 'value'...
(2) [{…}, {…}]
(3) [{…}, {…}, {…}]
(4) [{…}, {…}, {…}, {…}]
...
对 API 为我提供的任何想法有什么想法吗?
【问题讨论】:
-
请编辑您的问题以显示任何人都可以运行以重现问题的最少的**完整**/独立代码。具体来说,显示您正在收听的数据库路径,以及您如何处理收到的数据(最好记录它,如果您可以通过这种方式重现问题)。
-
感谢您的意见!它确实不是“复制、粘贴和运行”示例,但第一个代码块不包含所有内容吗?例如。
the database path?任何帮助表示赞赏,我会更新我的问题。谢谢! -
您的第一个代码块显示了您如何运行一个写入数据的事务。我要求在您遇到问题时查看最小但完整的观察者。
-
明白,我添加了完整的观察者代码
-
嗯...因为您正在使用事务,据我所知,您应该只在观察者上看到每个事务的一个值事件。如果您在没有 AngularFire 的情况下遇到同样的问题,您是否尝试过?您还可以在浏览器的“网络”选项卡中检查 Web Socket 流量,因为您应该只得到一个帧(取决于项目的数量)。如果这些都不能解释,你能在像 jsbin 这样的网站上重现吗?明天我也可以自己尝试一下。
标签: javascript firebase firebase-realtime-database angularfire2