Правильное завершение цепочки Rxjs?

Всем добрый день.

Есть такая цепочка:
....
private _onDestroy$ = new Subject<void>();
....

  this.appState.event$
      .pipe(
        flatMap((event: ICustomEvent) => {
          if (event) {
            this._event = event;
            return this.service.getEvenContent(event.id, {
              type: event.type,
              date: event.date,
            });
          } else {
            return throwError('Error');
          }
        }),
        takeUntil(this._onDestroy$),
        finalize(() => this.isLoading = false)
      )
      .subscribe(
        result => {
          this.content = result.text;
        },
        error => {
          console.log(error);
        }
      );

....
ngOnDestroy(): void {
    this._onDestroy$.next();
    this._onDestroy$.complete();
  }


Вопрос в том как правильно завершить всю цепочку вызовов, т.к. на сколько я понимаю у меня сейчас
finalize(() => this.isLoading = false) не вызывается, а takeUntil(this._onDestroy$) завершить подписку только на appState.event$ но не на service.getEvenContent()?

Или что использовать вместо flatMap/mergeMap в таких случаях?
  • Вопрос задан
  • 197 просмотров
Пригласить эксперта
Ответы на вопрос 2
dasha_programmist
@dasha_programmist
Software engineer TS/JS/Go/C#/React/Angular2+
Чтобы завершить подписку, достаточно будет вызвать unsubscribe() у подписки - объекта, который вернется в результате вызова subscribe(). Еще обрати внимание, что тело flatMap тут будет дергаться каждый раз когда эмитится ивент, поэтому есть смысл вызывать this.service.getEvenContent().first() чтобы не было утечки, если конечно оно там внутри не вызывается уже
Ответ написан
finalize должен вызваться, как только в this._onDestroy$появились данные.

flatMap сам отписывается, когда надо. То есть либо когда не осталось данных в цепочке getEvenContent, либо когда отписались от результата.

Может имеет смысл использовать switchMap, чтобы не обрабатывать данные из getEvenContent для предыдущего события, когда уже пришло новое?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы