运算符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
触发并停止当前订阅时会发生什么感到困惑。在管道顺序中调用它的时间会受到什么影响(如果有任何影响)。
答案 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
可能没什么问题,因为只有一个内部可观察到的东西。