Способ 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;
    }
}

Первый вопрос, я думаю, заключается в том, является ли использование Subject таким образом анти-шаблоном или нестандартным использованием. (Это применимо?)

Во-вторых, я чувствую, что должен повторно использовать и иметь возможность повторно использовать isLoadedSubject вместо того, чтобы нуждаться в отдельном логическом значении. Я не уверен, как это сделать вне подписки и ее обратного вызова complete. AsyncSubject имеет свойство isCompleted, но оно закрытое.


person nshew13    schedule 06.09.2018    source источник
comment
Способ Rx — вообще ничего не делать. Rx не просто так является монадическим функциональным языком. Просто используйте .publish(), чтобы преобразовать горячую наблюдаемую в холодную.   -  person Aron    schedule 06.09.2018


Ответы (1)


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

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

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

См. также: Angular 5 кэширует вызовы API HTTP-сервиса

person Andrei Tătar    schedule 06.09.2018