ngrx从生效之日起多次调度相同的操作



我有一个相当简单的问题,但无法弄清楚我做错了什么——我在网上找到的解决方案似乎都不适合我:

在打开我的应用程序的某个部分时,会调度一个操作从后端加载项目ID的当前列表。

一旦检索到这个列表,我需要加载我刚刚获得id的所有项目。

( GET /api/items -> [1,2] -> GET /api/items/1, GET /api/items/2)

我试图用这样的效果来解决这个问题:

我选择了mergeMap,因为我想发出一系列操作,但不关心它们的顺序。

像这样做

@Effect() loadList$: Observable<LoadAction[]> = this.actions$.pipe(
ofType<LoadListAction>(LOAD_LIST_ACTION),
mergeMap( _ =>
this.backendService.getItemIds().pipe(
filter( it => it.items.length > 0),
map(response => response.items.map(it => new LoadAction(it.id));
)
)
)
);

给我这个错误:

"invalid action was dispatched" [{"type":"[ITEMS][INIT] load item", "payload":"1"}, {"type":"[ITEMS][INIT] load item", "payload":"2"}],
TypeError: Actions must have a type property

这是有道理的,因为可观测到的现在直接发射阵列,所以我切换到两次合并映射:

@Effect() loadList$: Observable<LoadAction[]> = this.actions$.pipe(
ofType<LoadListAction>(LOAD_LIST_ACTION),
mergeMap( _ =>
this.backendService.getItemIds().pipe(
filter( it => it.items.length > 0),
mergeMap(response => response.items.map(it => new LoadAction(it.id));
)
)
)
);

这里仅最后一个动作到达减速器(/api/items/2),第一个动作消失并且从未生效。(我核实了一下,这个列表的长度是2(。

这里有什么问题?

确保两个操作的Action.type不同,在我的情况下,我意外地将两个不同操作的类型设置为相同。我很难调试它,但最终我找到了问题所在。

最新更新