Firebase 实时数据库中 snapshotChanges 的事务和行为

时间:2021-08-02 00:18:34

标签: javascript firebase firebase-realtime-database angularfire2

我正在使用 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 为我提供了什么吗?

1 个答案:

答案 0 :(得分: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