angular - Rxjs 方法让调用者知道方法已完成,并缓存该结果
问题描述
长话短说:我有一个 Angular 应用程序通过调用一个调用第二个数据服务的服务进行初始化。中间服务接收并处理来自数据服务的数据后,它必须通过 Observable 或 Subject 与应用程序通信,应用程序才能继续加载。我想短路对同一方法的任何后续调用。
export class MiddleService {
private triedOnce = false;
private isLoadedSubject = new AsyncSubject();
public loadConfig (): AsyncSubject<any> {
if (!this.triedOnce) {
this.isLoadedSubject.next(false);
this.dataService.getConfiguration(...).subscribe(
(data) => {
// do stuff with data
this.isLoadedSubject.next(true);
}
);
this.isLoadedSubject.complete();
this.triedOnce = true;
}
return this.isLoadedSubject;
}
}
我想,第一个问题是使用这样的主题是否是反模式或非标准使用。(这适用吗?)
其次,我觉得我应该重用并且能够重用,isLoadedSubject
而不是需要单独的布尔值。我不确定如何在订阅及其complete
回调之外执行此操作。有AsyncSubject
一个isCompleted
财产,但它是私人的。
解决方案
我会做类似的事情:
export class MiddleService {
public readonly config$ = this.dataService.getConfiguration(...)
.pipe(shareReplay(1));
}
这将延迟获取配置,并将缓存它以供所有后续调用。
推荐阅读
- javascript - 如何在 Android 中查找导致 Cordova 应用程序崩溃的原因?
- python - 不使用 datetime 模块,即使这样,TypeError: 'DatetimeIndex'
- asp.net-mvc - 从 MVC 控制器启动网页
- java - spring data RepositoryRestResource 未映射到spring boot应用程序中的端点
- android - 创建新子项时,Recyclerview 会不断从 Firebase DB 重新填充数据
- java - java中的线程生产者消费者
- python - 从 csvs 动态创建多个不相同的 postgres 表并使用 Python 转储 csv 数据
- xpath - XPath - “获取第一个 tr,它的第一个 td 的文本等于 'abcd'”
- python - 使用正则表达式根据上一行的内容查找所有数字
- google-app-engine - 在 App Engine Flexible 中保护 URL(使用 AIM 中的用户和角色)