Firebase 实时数据库中 snapshotChanges 的事务和行为
Transactions and behaviour of snapshotChanges in Firebase realtime database
我正在使用 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 对我有什么建议吗?
我无法使用常规 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");
});
当我在一个空节点上 运行 时,我得到的输出是:
"Listener got a snapshot with 0 child nodes"
"Listener got a snapshot with 100 child nodes"
这是预期的行为,因为侦听器首先获取空节点,然后从 t运行saction 获取具有 100 个子节点的节点。
我正在使用 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 对我有什么建议吗?
我无法使用常规 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");
});
当我在一个空节点上 运行 时,我得到的输出是:
"Listener got a snapshot with 0 child nodes"
"Listener got a snapshot with 100 child nodes"
这是预期的行为,因为侦听器首先获取空节点,然后从 t运行saction 获取具有 100 个子节点的节点。