2016-11-21 85 views
0

趕上從BehaviorSubject錯誤由異步管簽約時,我有一個rxjs BehaviorSubject我同意使用async管從角2,我有一個catch來處理它拋出最後的錯誤。 問題是,每當我得到一個錯誤,它就會啓動一個無限循環,因爲我的catch返回從BehaviorSubject派生的Observable,我認爲當我返回catch時,async管道重新訂閱了可觀察值。無限循環對角2

代碼看起來大致是這樣的:

ListService - 是@Injectable在那裏我有BehaviorSubject並與Observable財產。

private listSubject: BehaviorSubject<IItem[]>; 

public get listObservable() { 
    return this.listSubject.asObservable() 
} 

private error(error: IError) { 
    this.listSubject.error(error); 
} 

ListComponent - 是@Component顯示列表中觀察到。你可以看到,我的catch返回當前可觀察對象,因爲它必須返回一個可觀察對象。所以,發生什麼是,當我發送this.listSubject.error(error)代碼進入一個無限循環無限期調用catch,因爲,就像我之前說過的,我認爲BehaviourSubject重新拋出錯誤,因爲async管道重新訂閱可觀察的catch返回它。

我試圖在錯誤中返回以前的緩存陣列以返回Observable.of(error.cached),但我得到了一組全新的問題,因爲認爲異步沒有訂閱BehaviorSubject了。

就像我之前說的,這是我真實代碼的粗略表示,但邏輯基本上是這樣。

我一直在嘗試各種不同的方法,但我無法設法得到這個無限循環停下來。

在此先感謝您的幫助。

+0

拋出錯誤的類型是什麼,以及在錯誤的情況下,您希望代碼執行什麼操作? – KwintenP

+0

任何錯誤,我在List服務中使用該錯誤函數傳遞錯誤,即使我只傳遞一個字符串,我也會遇到問題。但通常我傳遞api響應錯誤。 –

回答

2

這是一個通常不好的主意,手動派遣一個主題上的錯誤,應該只彈出數據(如你的情況下的BehaviorSubject)。原因是當Subject發生錯誤時,Subject本質上是已死 - >意思是說沒有新數據可以再彈出。這是rxjs的核心概念之一。這裏是一個小例子:

let stream$ = new Rx.BehaviorSubject(1); 

stream$.subscribe(x => console.log("Logging: " + x), e => console.error("Error: " + e)); // logs 1, 2, Error: ... 

stream$.next(2); 
stream$.error(new Error("Some error message.")); 
stream$.next(3); // this will have no effect, because the stream is "dead" 
stream$.subscribe(x => console.log("Logging 2: " + x), e => console.error("Error: " + e)); // this will just log the error 

對於你的情況,這意味着你做了一些錯誤處理,但當時剛剛回歸的「老,死的,錯誤」 -subject - 換句話說:傳播錯誤下來流。 (我不是假設handleError()創建一個新鮮Subject,這將是一個可怕的實踐反正。)

通常這意味着.error應該僅被用於執行所定義的操作和具有確定的結果的數目的流然後完成或拋出錯誤,但不在Subject上,您希望在應用程序的整個生命週期內發出數據。

如何解決你的情況:快速&骯髒(真的很髒!)的方式是使用兩個單獨的主題,一個用於數據,一個用於錯誤(用.next彈出)。

正確的修復方法:將您的體系結構拆分爲數據生成流和數據存儲部分。

生命週期會是這個樣子:

剖成流量

  1. 某些事件(如按鈕,點擊,或一些基於時間的事件)
  2. Service.generateOrFetchData()handleErrors。 ()
  3. StoreService.someSubj.next(data) - (步驟3可以是可選的,具體取決於您在步驟2中如何處理錯誤)

訂閱流

  1. UI訂閱StoreService.someSubj
  2. UI自動更新,每當新的數據被彈出,沒有錯誤處理所需

完美修復將使用像這樣隨時可以使用的思維透視存儲體系結構,但是在現有項目中實現這一點會帶來重大的重構需求。

+0

是的,我現在跟着髒兮兮的修補程序去了,一旦我完成了目前我正在做的事情,我會回到這個。 –