2017-09-27 17 views
0

我有一個問題,我相信是由於我在ngrx-store中的初始狀態的組合,並試圖從observable得到初始響應。我使用的數據表,以及大量的靜態報表的數據 - 所以我只是想從第一個「真正」的迴應:ngrx/store - 競爭條件下的可觀察對象

Observable.zip(this.sites$, this.devices$, this.machines$, this.machineContent$)

在我NGRX減速我定義爲初始狀態[]爲每個這些。然而,有時候(我認爲是一種競爭條件),其中一個觀測值將返回爲[],但是Observable.zip可以解決,並且在那個點上錯誤地呈現我的表。

我已經試過的各種組合:

Observable.zip(this.sites$.skip(1), this.devices$.skip(1), this.machines$.skip(1), this.machineContent$.skip(1))

Observable.zip(this.sites$.skip(1), this.devices$.skip(1), this.machines$.skip(1), this.machineContent$.skip(1)) .take(1)

而這些工作的時間約爲80%。 我也有一個可觀察到的isLoaded對於每個觀察對象(machinesIsLoaded,machineContentIsLoaded等),我想用.takeUntil,除了我必須檢查每個這些返回true,它感覺就像我一定做錯了什麼。

任何想法?

+0

你可以做'.filter(item => item && item.length> 0)'或者類似的東西嗎? – Pace

+0

我試過了 - 問題是該項目可以合法地具有0的長度,所以我希望它仍然可以解決。不過,也許我可以使用過濾器。 –

回答

1

首先:確保你的減速器沒有在狀態變化的陣列,因爲會導致你的問題。確保你正在克隆數組或使用ImmutableArray。

二:不是filter,使用skipWhile

function isEmpty(table: any[]) : boolean { return !table || !table.length; } 

Observable.zip(this.sites$.skipWhile(isEmpty), this.devices$.skipWhile(isEmpty), this.machines$.skipWhile(isEmpty), this.machineContent$.skipWhile(isEmpty)); 

這會忽略結果,直到陣列得到填充,然後始終即使陣列再次空使用效果。

+0

謝謝。我使用storeFreeze,所以它不應該變異。我認爲我的問題是初始狀態 - 它總是返回[],所以以這種方式使用skipWhile永遠不會有問題。然而,我確實使用了skipWhile,傳入isLoaded觀察值並跳過,直到所有這些都成立。 –