我正在使用 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 为我提供了什么吗?
答案 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 个子节点的节点。