繁体   English   中英

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

[英]How to track if data has been loaded in fully reactive way?

考虑以下代码

 heroes: Obserable<Hero[]>;
 private _loadHeroes: EventEmitter<void> = new EventEmmiter;

 constructor(heroService: HeroService) {
    this.heroes = _loadHeroes.switchMap(() => heroService.fetchHeroes());
 }

没有人知道如何通过手动订阅以适当的反应方式添加诸如heroesLoaded: BehaviorSubject<boolean>类的东西吗? 当然可以做类似的事情

    this.heroes = _loadHeroes.switchMap(() => {
      this.heroesLoaded.next(false)
      heroService.fetchHeroes().finally(() => this.heroesLoaded.next(true)
    });

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

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

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)
   );
}

如果需要,可以使heroesLoaded一个BehaviorSubject并用this.heroesLoaded.next(false)替换this.heroesLoaded = false行-我不知道会带来什么好处,但是使用tap和finalize的原理是相同的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM