【问题标题】:Transactions and behaviour of snapshotChanges in Firebase realtime databaseFirebase 实时数据库中 snapshotChanges 的事务和行为
【发布时间】: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


【解决方案1】:

我无法使用常规 JavaScript SDK 重现您所描述的行为。在单个 jsbin 中使用两个应用实例来模拟两个客户端:

var primary = firebase.initializeApp(CONFIG);
var secondary = firebase.initializeApp(CONFIG, "secondary");

var ref = primary.database().ref("68615288");
var objs = {};
for (var i=0; i < 100; i++) objs["key_"+i] = "hello";

ref.transaction(function(transaction) {
  return objs;
}, undefined, false);

secondary.database().ref("68615288").on("value", function(snapshot) {
  console.log("Listener got a snapshot with "+snapshot.numChildren()+" child nodes");
});

当我在一个空节点上运行它时,我得到的输出是:

"监听器得到一个包含 0 个子节点的快照"

“监听器得到一个包含 100 个子节点的快照”

这是预期的行为,因为侦听器首先获取空节点,然后从事务中获取具有 100 个子节点的节点。

https://jsbin.com/wuhuyih/1/edit?js,console

【讨论】:

  • 嗨弗兰克,抱歉耽搁了。我无法理解为什么它在我的 hello-world 示例中确实有效,但在我的应用程序中却无效。我终于明白了发生在我身边的事情。在我看来,这是由于我对 Angular 的错误以及我订阅事件的方式造成的。我不小心注册了太多订阅者而没有取消订阅。最后,我有很多僵尸订阅者。清理完那部分后,我可以确认现在可以按照您的描述工作。再次感谢您确认这是正确的行为。
猜你喜欢
  • 2021-11-23
  • 2020-05-15
  • 2018-12-29
  • 2019-05-15
  • 2020-09-19
  • 1970-01-01
  • 2019-12-23
  • 1970-01-01
  • 2022-01-23
相关资源
最近更新 更多