Здесь будет подход:
languageCategories$ = this.selectedLanguage$.pipe(
switchMap(
x => merge(
of(null), // Emit `null` right away - start loading
this._matchService.getCategoriesAsync(x),
)
),
// shareReplay() ? not sure about this
);
Я прокомментировал shareReplay
, потому что я не уверен, что он должен быть там, потому что он также будет кешировать значения null
(испускаемые при асинхронности c op start загрузка ). Чтобы избежать этого, вы можете попробовать это:
languageCategories$ = this.selectedLanguage$.pipe(
switchMap(
x => merge(
of(null),
this._matchService.getCategoriesAsync(x),
)
),
tap(v => v === null && doSideEffect()),
filter(v => !!v),
shareReplay()
);
Также учтите, что вы можете добавить некоторые конфигурации к оператору shareReplay
: shareReplay({ bufferSize, windowTime, scheduler, refCount })
, где
-
bufferSize
- сколько значений должно быть кэшировано; если предел превышен, будет сохранено самое старое сохраненное значение windowTime
- как долго значения должны храниться scheduler
- указать пользовательский планировщик refCount
- если ReplaySubject
(который используется за кулисами) должен быть уничтожен, если нет активных подписчиков