我有一个问题,我认为这是由于我在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}},感觉我必须做错事。
有什么想法吗?
答案 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
这将忽略结果,直到数组被填充,然后总是使用结果,即使数组再次为空。