Rxjs способ сообщить вызывающему методу метод завершен, и кешировать этот результат - PullRequest
0 голосов
/ 06 сентября 2018

Короче говоря: у меня есть приложение 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, но оно является приватным.

1 Ответ

0 голосов
/ 06 сентября 2018

Я бы сделал что-то вроде:

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

Это задержит получение конфигурации и кеширует ее для всех последующих вызовов.

См. Также: Угловые 5 кэшируемых вызовов HTTP службы API

...