gpt4 book ai didi

firebase-realtime-database - 冷热 AngularFire 可观察对象

转载 作者:行者123 更新时间:2023-12-04 08:44:44 25 4
gpt4 key购买 nike

我的 Angular2/Firebase 应用程序的组件中有以下代码:

ngOnInit() {
this.allItems = this.angularFireDatabase.object(`projects/${id}/results`).map(
results => {
const x = itemMapper(results);
console.log(x); // <-- executes three times
return x;
});

const groupedData = this.allItems.map(groupMapper);
this.towers = groupedData.map(towerMapper);
this.units = groupedData.map(unitMapper);
}

我在模板中使用 this.allItemsthis.towersthis.units 以及 async 管道:

<sanddance [items]="allItems | async">

<p-dataTable [value]="towers | async">
<p-dataTable [value]="units | async">

代码运行正常,但问题是日志执行了三次——换句话说,创建this.allitems 的映射运行了三次。如果我删除 this.towersthis.units 分配,那么日志将按预期只执行一次。换句话说,this.towers = groupedData.map(towerMapper); 行似乎导致对创建 this.allItems 的映射器的额外调用,尽管它不应该不需要,我也不想。它甚至可以重新访问 Firebase 数据库中的数据,这显然是个问题,尤其是因为这是大量数据?

基于我对“热”和“冷”可观察对象的有限理解,似乎 AngularFire 可观察对象被视为“热”,并在下游有人尝试映射它(或订阅它,这本质上就是 async 管道所做的)。

我错过了什么?

最佳答案

AngularFire2 可观察对象是冷可观察对象。每个订阅都会看到一个单独的 Firebase Reference在内部创建 - 然后附加监听器等。

当您的代码片段中的组合可观察对象被订阅时,每个对象都会影响对 AngularFire2 object 可观察对象的订阅。如果您想改用单个订阅,可以使用 share运算符(operator):

import 'rxjs/add/operator/share';

this.allItems = this.angularFireDatabase.object(`projects/${id}/results`).map(
results => {
const x = itemMapper(results);
console.log(x); // <-- this should execute only once
return x;
}).share();

const groupedData = this.allItems.map(groupMapper);
this.towers = groupedData.map(towerMapper);
this.units = groupedData.map(unitMapper);

share 运算符:

Returns a new Observable that multicasts (shares) the original Observable. As long as there is at least one Subscriber this Observable will be subscribed and emitting data. When all subscribers have unsubscribed it will unsubscribe from the source Observable. Because the Observable is multicasting it makes the stream hot. This is an alias for .publish().refCount().

关于firebase-realtime-database - 冷热 AngularFire 可观察对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43671465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com