RXJS - 获取所有当前(活动)订阅

nco*_*hen 12 rxjs angular

是否可以在不手动存储的情况下获取所有"活动"订阅?

我想要unsubscribe所有"活动"订阅,并且不希望在数组或变量中引用它们中的每一个.

mar*_*tin 8

我取决于你是使用主题还是观察,但可能无法"自动"执行此操作.

观测

我不认为你可以拥有"订阅的Observable"这样的东西,因为你要么存储一个Observable,要么订阅它:

const source = Observable.of(...)
  .map(...);

const subscription = source
  .subscribe();
Run Code Online (Sandbox Code Playgroud)

这里source代表一个Observable并 subscription代表一个订阅.

请注意,您可以拥有一个Subscription存储多个其他订阅的实例:

const subscriptions = new Subscription();

const sub1 = Observable...subscribe();
const sub2 = Observable...subscribe();
const sub3 = Observable...subscribe();

subscriptions.add(sub1).add(sub2).add(sub3);

// Then unsubscribe all of them with a single 
subscriptions.unsubscribe();
Run Code Online (Sandbox Code Playgroud)

主题

如果您正在使用主题,他们自己拥有该unsubscribe方法,请参阅https://github.com/ReactiveX/rxjs/blob/master/src/Subject.ts#L96.

但请注意,这会使主题"停止",有关详细信息,请参阅https://medium.com/@martin.sikora/rxjs-subjects-and-their-internal-state-7cfdee905156


小智 7

其中一种选项是结合使用 takeUntil 和Subject 来停止所有(Observable)订阅。

terminator$: Subject<boolean> = new Subject();

Observable.timer(1000)
  .do(i => console.log(`timer 1: ${i}`))
  .takeUntil(terminator$)
  .subscribe();

Observable.timer(5000)
  .do(i => console.log(`timer 2: ${i}`))
  .takeUntil(terminator$)
  .subscribe();

const stopSubscriptions = () => terminator$.next(true);
Run Code Online (Sandbox Code Playgroud)


rpl*_*ndo 5

是的 .observers如果您使用的Subject对象,只需调用属性rxjs

希望这可以帮助。

  • 遗憾的是 [`.observers`](https://github.com/ReactiveX/rxjs/blob/c2b3e88b9c2dbb9965833ca130b60d6466ef9552/src/internal/Subject.ts#L19-L20) 已被弃用,并将在 v8 中成为内部版本。 (3认同)