RxJS:forkJoin與BehaviorSubject

使用forkJoin多個Subject時沒有注意看教學文件碰到的坑。


教學文件說的很清楚,forkJoin():

When all observables complete, emit the last emitted value from each.

只有當被forkJoin的所有對象都complete的時候,才會emit各自的最後一個value。

在做共用元件的時候,因為元件內有非同步的資料處理,

因此共用元件設計了一個檢查非同步方法是否做完的method讓使用共用元件的頁面元件呼叫,情境如下:

如果共用元件內的非同步方法已經做完,就return一個of(undefined)的observable;

如果共用元件內的非同步方法已經做完,就return元件內一個private subject.asObservable(),做完時會呼叫subject.next()。

開發過程中,

因為頁面元件中使用到兩個共用元件,所以將兩個共用元件檢查method回傳的observable給forkJoin起來,

卻發現永遠不會進入subscribe()中success的callback,

原因就是出在共用元件的subject我只呼叫了next(),沒有呼叫complete()。

不呼叫complete()的原因,原本是希望這個subject能夠被重複使用,不用每次檢查都用一個新的instance。

不過既然可能被用在forkJoin()中,還是需要complete()之後再重新建立一個instance供下次檢查才行。