繁体   English   中英

管道 RxJS 可观察到现有主题

[英]Pipe RxJS observable to existing subject

有正在使用的现有主题:

const fooSubject = new BehaviorSubject(null);

还有另一个可观察的(本例中的另一个主题):

const barSubject = new Subject();
barSubject.subscribe(
  value => fooSubject.next(),
  err => fooSubject.error(err),
  () => fooSubject.complete()
);

barSubject.next('bar');

该代码有效,但看起来很笨拙。

有没有更好的方法来管道(广义上,不一定使用pipe运算符) barSubject可观察到fooSubject 它看起来像是一个可以由库本身处理的操作。

由于Subject已经是方法next()error()complete()的观察者,你只需将它订阅到任何Observable:

const fooSubject = new BehaviorSubject(null);

const barSubject = new Subject();
barSubject.subscribe(fooSubject);

barSubject.next('bar');

关于在源 Observable 完成后取消订阅,我一直在使用这段代码。 它按预期运行,但我不知道它是否是“反模式”...?

const subscription = this.http.get(url)
  .pipe(finalize(() => subscription.unsubscribe()))
  .subscribe(this.mySubject$);

编辑:您不需要取消订阅http.get(..)因为它是自动完成的 因此,对于上面的代码,正确的形式是:

this.http.get(url).subscribe(mySubject$)

编辑 2:上述代码的一个问题是,当 http.get 完成时, mySubject$也将完成。 现在,如果您.subscribe(mySubject$)mySubject$.next(..)它不会发出值。 为避免这种情况并保持mySubject$热,请使用以下代码:

this.http.get(url).subscribe(r => this.mySubject$.next(r))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM