Observable运算符takeUntil()取决于它在pipe()中的顺序

时间:2018-09-01 19:24:38

标签: javascript rxjs observable

运算符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 :(得分:5)

我的理解是,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运算符返回的observable将完成,并自动取消订阅任何订户。

     

但是,c的订阅者未订阅takeUntil返回的可观察对象-它订阅了combaLatest返回的可观察对象-因此,在takeUntil观察对象完成后不会自动取消订阅。

     

c的订阅者将保持订阅状态,直到传递给CombinedLast的所有可观察对象完成为止。因此,除非b在发出通知者之前完成,否则对b的订阅将泄漏。

虽然这篇文章专门提到switchMap,但我怀疑逻辑是相同的。 switchMap可能没什么问题,因为只有一个内部可观察到的东西。