rxjs reduce不会继续

时间:2019-01-09 10:51:27

标签: angular rxjs ngrx-effects

我在angular 7应用程序中具有以下设置:

@Effect({dispatch:false})
LoadInstances$ = this.actions$.pipe(
ofType(fromAppAction.AppActionTypes.LoadInstances),
take(1), // <-- solved my problem
switchMap((action: fromAppAction.LoadInstances) =>
      this.entityService.GetInstances()
    ),

switchMap(instances=>from(instances)), // flatten the array to single values
flatMap( // combine the instance with its UserData
    (inst)=>this.entityService.GetCurrentUserInfo().pipe(take(1)),
    (inst,usr)=>({...inst, UserData:usr})
),
flatMap(
  (inst)=>this.entityService.GetUserPersonalSettings(inst.id).pipe(take(1)),
  (inst,settings)=>({...inst, Settings:settings})
),
tap(result=>console.log('before reduce:',result)), // <-- this gets called 3 times (I have 3 instances)
reduce<Instance>((a, c) => [...a, c], []), // accumulate all results to one array
tap(result=>console.log('instances: ', result)), // <-- this gets never called
...

本质上,我有一个实例数组,将它们展平,为每个实例调用GetCurrentUserInfo和GetUserPersonalSettings,将结果作为属性添加到实例,然后想将它们累加回Instance []。

到目前为止,该方法仍然有效,只是reduce功能不会继续。我知道这是因为其他可观察对象之一未完成。但是那怎么可能呢? 初始from(instances)遍历数组,然后应该完成,是吗?而且对GetPersonalSettings的调用只是简单的httpClient.get()调用,根据文档,这些调用是在成功调用后完成的单值可观察值。

有人可以帮助我吗?

[编辑] 扫描不是这里的选择,因为我需要完整的实例数组才能继续。 [Edit2] toArray与reduce具有相同的问题,它仅在前一个Observable完成时才发出结果。

无论如何:我不想更改此设置,因为它基本上可以正常工作。我只想了解哪个Observable尚未完成以及原因。这将解决我的问题。

1 个答案:

答案 0 :(得分:0)

最近我了解了运算符toArray,可能会简化您的代码。 由于第一个switchMap之前的流未完成

,因此您的流未完成
/* What is here? Probably still open stream? */
switchMap((action: fromAppAction.LoadInstances) =>
  this.entityService.GetInstances()
),

快速尝试将first()take(1)放在第一个switchMap之前