如何跟踪数据是否以完全反应方式加载?

时间:2018-08-17 14:28:38

标签: angular rxjs

考虑以下代码

email = globalapp.objects.values_list('email', flat=True).get(id=1)

有人知道如何不进行手动订阅以适当的反应方式添加类似 heroes: Obserable<Hero[]>; private _loadHeroes: EventEmitter<void> = new EventEmmiter; constructor(heroService: HeroService) { this.heroes = _loadHeroes.switchMap(() => heroService.fetchHeroes()); } 的东西吗? 当然可以做类似的事情

heroesLoaded: BehaviorSubject<boolean>

但是我相信这不是最好的方法,它的想法是将所有订阅留给异步管道,并且仅在流中完成所有操作。我也不想使用如上所述的不纯净的副作用来编写它。我尝试使用pulishBehavior运算符,但是我看不到如何使用它来响应订阅时刻和价值体现/错误时刻。有可能吗?我对至少可能更好但不一定完美的任何可能的解决方案感兴趣。

1 个答案:

答案 0 :(得分:1)

如果您只想跟踪它们是否已加载(例如,显示加载指示器):

heroes: Obserable<Hero[]>;
heroesLoaded: boolean = false;

constructor(heroService: HeroService) {
   this.heroesLoaded = false;
   this.heroes = of(null).pipe(
       tap(() => this.heroesLoaded = false),
       flatMap(() => heroService.fetchHeroes()),
       finalize(() => this.heroesLoaded = true)
   );
}

如果愿意,可以让英雄加载一个BehaviorSubject并将this.heroesLoaded = false行替换为this.heroesLoaded.next(false)-我看不出会有什么好处,但是使用tap和finalize的原理是相同的