具有ngrx / store的可观察量 - 竞争条件

时间:2017-09-27 16:15:09

标签: javascript angular rxjs observable ngrx-store

我有一个问题,我认为这是由于我在ngrx-store中的初始状态的组合,并试图从一个observable获得初始响应。我正在使用数据表和静态报告的大量数据 - 所以我只想要第一个“真正的”响应:

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

在我的ngrx reducer中,我将每个初始状态定义为[]。但是,有时会出现(我认为是竞争条件)其中一个observable将以[]的形式返回,但是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%的时间。 对于我考虑与.takeUntil一起使用的每个可观察对象(machinesIsLoaded,machineContentIsLoaded等),我也有一个'isLoaded'可观察对象,除了我必须检查其中每一个都返回{{ 1}},感觉我必须做错事。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

首先:确保你的reducer不会在状态中改变数组,因为 会导致你出现问题。确保您正在克隆数组或使用ImmutableArray。

第二:使用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));
mail.conf

这将忽略结果,直到数组被填充,然后总是使用结果,即使数组再次为空。