簡體   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