2017-06-27 43 views
3

在Angular 4.x中使用RxJS,我看到兩種截然不同的模式,用於從用戶發起的操作流中生成Observables。一個流是用戶單擊生成新對象的「添加項目」按鈕的直接結果。另一個是我使用的一些第三方代碼發佈的一系列事件。RxJS:正確的方式來手動發射Observable

我想能夠結合使用像'combineLatest'這樣的兩個流來生成一個單一的Observable。

用我的按鈕,我已經遵循了以下模式:

const signal = Observable.create(
      (observer) => { 
       this.additem= (item) => observer.next(item); 
      } 
     ); 

this.item$ = signal.map((item) => [item]) 
          .scan((accumulator, value) => { 
           return accumulator.concat(value); 
          }); 

但是,我看到了很多的信息,說我應該使用對象來代替 - 這我想用我的事件用回調像這樣:

sort$ = new Subject(); 

sortChange(sort){ 
     sort$.next(sort); 
} 

然後我試圖將這些類似這樣的結合:

combine$ = Observable.combineLatest(sort$, item$, 
        (sort, items) => { 
         return "something that does stuff with these";} 
     ); 

我的問題是 - 「手動」生成流的首選模式是什麼?可以/應該將觀察對象和主體組合成一個單獨的可觀察對象,就像我在這裏試圖做的一樣?

+0

我認爲,這個信息的最佳來源是這個問題的答案:https://stackoverflow.com/questions/39494058/angular-2-behavior-subject-vs -observable即使你的問題對我來說不完全是一個重複的東西,感覺這個答案可能是你需要做出選擇的。 – Supamiu

+0

如果你想結合兩個Observable你可以使用運算符合並 – alehn96

回答

1

當然,您可以將Observables和Subjects組合成一個流。

我認爲這裏的問題是什麼讓你更有意義的用例。從執行類似「添加項目」功能時的描述中,我更願意使用Subject而不是Observable.create

這是因爲每次訂閱您的signal時,您都會重新指定this.additem。每個觀察者都需要調用Observable.create。請注意,Observable.create更正確的用法應該是這樣的:

const signal = Observable.create((observer) => { 
    this.additem = (item) => observer.next(item); 
    return() => this.additem = null; 
}); 

當你從這個可觀測退訂返回的回調() => this.additem = null被調用,這就是你應該處理所有清理的地方。

但是,如果你把兩個訂閱到signal那麼你會,如果你選擇了退訂觀察員你會this.additem = null,它可能會導致意外的行爲的一個覆蓋this.additem兩次,然後。

所以在這種情況下,使用Subject更有意義。例如像這樣:

const subject = new Subject(); 
this.additem = (item) => subject.next(item); 

如果你想看到的Observable.create更真實生活中的例子看看比如這個:Subscribe to a stream with RxJS and twitter-stream-api module

編輯:也看看距導線開發這些文章RxJS 5:

+0

謝謝!這是我正在尋找的那種答案。這樣的缺陷對於我看文檔並不明顯,而且我知道必須有理由選擇一種方法,因爲兩者似乎都可行。 – Potatoes

+0

@土豆我給我認爲非常有用的文章添加了幾個鏈接 – martin

相關問題