Использование takeUntil на внутренней наблюдаемой - PullRequest
1 голос
/ 01 октября 2019

Как лучше написать этот фрагмент?

Чего я пытаюсь добиться, так это начинать новый опрос (и отбрасывать предыдущий) каждый раз, когда eventGenerator$ что-то выдает, но опрос можно отменитьтакже другим уведомителем (anotherEvent$)

this.eventGenerator.asObservable()
  .subscribe(event => {
    if (this.polling$) {
      this.polling$.unsubscribe();
    }
    this.polling$ = timer(0, 1000)
      .pipe(
        switchMap(() => this.service.getSomething())
        takeUntil(this.anotherEvent$)
      )
      .subscribe();
  })

Одно из основных правил состоит в том, чтобы не подписываться на другие подписки внутри метода subscribe (). Для этого switchMap оператор звучит как хороший выбор для объединения в цепочку, но если используется takeUntil, а anotherEvent$ испускает, он отменит подписку целиком, а не только часть опроса, поэтому другой выброс eventGenerator не будетобрабатываться больше и не будет создавать другой таймер.

1 Ответ

2 голосов
/ 01 октября 2019

Вы можете просто реструктурировать своих операторов:

this.eventGenerator$.pipe(
  switchMap(() => timer(0, 1000).pipe(
    switchMap(() => this.service.getSomething()),
    takeUntil(this.anotherEvent$),
  ),
).subscribe(...);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...