angular - 如何跟踪数据是否以完全反应的方式加载?
问题描述
考虑以下代码
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)
);
}
如果需要,您可以将 herosLoaded 设置为 BehaviorSubject 并将该行替换为this.heroesLoaded = false
-this.heroesLoaded.next(false)
我看不出会带来什么好处,但使用 tap 和 finalize 的原理是相同的。
推荐阅读
- merge - 当冲突文件都是 package.json 文件时如何解决合并冲突?
- android - 无法解决设计的依赖性:27.1.1
- javascript - 等效于 Java 中的 !== null 和 === null
- node.js - 是否可以检查在 exec 中运行的 shell 命令中是否存在文件夹?
- shell - 用常量日期字符串替换 SQL 字符串中的静态子字符串
- r - 计算跨另一个分类变量的两个变量的置信区间的平均差
- google-analytics - 在 Google Analytics 中跟踪子域和查询参数
- graphql - 如何在提供的类方法中引用 Context 对象?
- git - 致命的:'藏匿'。也许 git-stash 坏了?
- c# - C#:为什么旋转不可逆矩阵并再次返回使其可逆