我有一个相当简单的问题,但无法弄清楚我做错了什么——我在网上找到的解决方案似乎都不适合我:
在打开我的应用程序的某个部分时,会调度一个操作从后端加载项目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不同,在我的情况下,我意外地将两个不同操作的类型设置为相同。我很难调试它,但最终我找到了问题所在。