Rxjs让调用者知道方法已完成并缓存结果的方法

时间:2018-09-06 19:27:42

标签: angular rxjs rxjs6

长话短说:我有一个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;
    }
}

我想,第一个问题是使用这样的Subject是反模式还是非标准用途。 (Does this apply?

第二,我觉得我应该重用并且能够重用isLoadedSubject而不是需要一个单独的布尔值。我不确定如何在订阅及其complete回调之外进行操作。 AsyncSubject有一个isCompleted属性,但它是私有的。

1 个答案:

答案 0 :(得分:1)

我会做类似的事情:

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

这将延迟获取配置,并将其缓存用于所有后续调用。

另请参阅:Angular 5 caching http service api calls