Значение Prepend для switchMap с Promise - PullRequest
0 голосов
/ 21 марта 2020

Каждый раз, когда this.selectedLanguage$ выдает новое значение, мне нужно выдать значение, рассчитанное асинхронно. Код, который я придумал, следующий:

public readonly languageCategories$ = this.selectedLanguage$.pipe(
  switchMap(x => this._matchService.getCategoriesAsync(x)),
  shareReplay());

Я использовал switchMap, потому что, если selectedLanguage изменяется при получении категорий, вызов asyn c должен быть отброшен и запущен новый ,

Проблема в том, что каждый раз, когда начинает ожидаться метод asyn c, я хочу, чтобы languageCategories испускал null (что означает, что категории вычисляются, [] будет вводить в заблуждение).
Как мне этого добиться?

Заранее спасибо!

1 Ответ

0 голосов
/ 21 марта 2020

Здесь будет подход:

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 (который используется за кулисами) должен быть уничтожен, если нет активных подписчиков
...