2017-09-27 16 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观察值并跳过,直到所有这些都成立。 –