首页 > 解决方案 > 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财产,但它是私人的。

标签: angularrxjsrxjs6

解决方案


我会做类似的事情:

export class MiddleService {
   public readonly config$ = this.dataService.getConfiguration(...)
        .pipe(shareReplay(1));
}

这将延迟获取配置,并将缓存它以供所有后续调用。

另请参阅:Angular 5 缓存 http 服务 api 调用


推荐阅读