我在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尚未完成以及原因。这将解决我的问题。
答案 0 :(得分:0)
最近我了解了运算符toArray,可能会简化您的代码。
由于第一个switchMap
之前的流未完成
/* What is here? Probably still open stream? */
switchMap((action: fromAppAction.LoadInstances) =>
this.entityService.GetInstances()
),
快速尝试将first()
或take(1)
放在第一个switchMap
之前