Зависит ли оператор Observable takeUntil () от его порядка в pipe () - PullRequest
0 голосов
/ 01 сентября 2018

Подвержен ли оператор takeUntil другим операторам, и нужно ли использовать его дважды внутри switchMap ?

Например;

Предположим, у меня есть наблюдаемое, которое выдает значение, когда я больше не хочу подписываться, и мы будем называть это this._destroyed.

Имеет ли значение, если перед takeUntil есть оператор delay ?

 of("something").pipe(
      delay(1000),
      takeUntil(this._destroyed)
 );

Отличается ли вышеуказанное от изменения порядка?

 of("something").pipe(
      takeUntil(this._destroyed),
      delay(1000)
 );

Что если я использую switchMap, нужно ли мне дважды takeUntil звонить?

 of("something").pipe(
      takeUntil(this._destroyed),
      delay(1000),
      switchMap(() => {
          return of("other").pipe(
             takeUntil(this._destroyed),
             delay(1000)
          );
      }
 );

Вышеописано ли функционально то же самое, что один раз вызвать takeUntil?

 of("something").pipe(
      delay(1000),
      switchMap(() => {
          return of("other").pipe(delay(1000));
      }),
      takeUntil(this._destroyed)
 );

Думаю, я не совсем понимаю, что происходит, когда takeUntil запускается и останавливает текущую подписку. Как это влияет на то, когда он вызывается в порядке конвейера (если это вообще имеет место).

1 Ответ

0 голосов
/ 01 сентября 2018

Насколько я понимаю, обычно takeUntil должен быть последним оператором в цепочке, поскольку это может привести к утечкам. В этой статье описывается проблема: https://blog.angularindepth.com/rxjs-avoiding-takeuntil-leaks-fb5182d047ef

В статье используется следующий пример:

import { combineLatest, Observable } from "rxjs";
import { takeUntil } from "rxjs/operators";

declare const a: Observable<number>;
declare const b: Observable<number>;
declare const notifier: Observable<any>;

const c = a.pipe(
  takeUntil(notifier),
  o => combineLatest(o, b)
).subscribe(value => console.log(value));

Из статьи:

Когда отправляет уведомление, наблюдаемое, возвращаемое оператором takeUntil, завершается, автоматически отписываясь от любых подписчиков.

Однако подписчик на c не подписан на наблюдаемую информацию, возвращаемую takeUntil - он подписан на наблюдаемую информацию, возвращаемую combLatest - так что он автоматически не отписывается после завершения наблюдаемой takeUntil.

Подписчик на c будет оставаться подписанным до тех пор, пока все наблюдаемые не будут переданы для комбинированного просмотра. Поэтому, если b не будет завершено до того, как отправит уведомление, подписка на b будет утечка.

Хотя в этом посте конкретно упоминается switchMap, я подозреваю, что логика та же. Это может быть менее проблематично с switchMap, поскольку существует только одна внутренняя наблюдаемая.

...