我不确定这篇文章的标题是否很好地解释了我的问题,但这是我的情况。
我有一棵树,里面有懒洋洋的孩子。展开树节点时,它会调度一个LoadChildrenAction
,其中包含刚刚作为有效负载扩展的父节点。
这是我的效果:
@Effect()
loadChildren$: Observable<Action> = this.actions$
.ofType(ActionTypes.LOAD_CHILDREN).switchMap((action: LoadChildrenAction) => {
return this.categoryService.loadChildren(action.payload).map(
children =>
new LoadChildrenSuccessAction({
parent: action.payload,
children
})
);
});
如果我只扩展一个节点,这就可以完美地工作。LoadChildrenSuccessAction
被调度,在我的化简器中,我更新树。
但是,如果我展开一个节点,然后在第一个操作完成之前展开另一个节点,则只有最后一个操作完成。
也就是说,我扩展一个节点,然后在第一个节点仍在加载时立即扩展另一个节点。第二个树节点使用其子内容进行更新,但第一个节点永远不会更新。事实上,两个LoadChildrenAction
被派出 - 每个扩展一个 - 但只有一个LoadChildrenSuccessAction
被派派。
如果我在categoryService.loadChildren
函数中放置一个console.log
,它会被记录两次 - 因此该服务被调用两次。但是只调度了一个操作,所以我丢失了第一个操作 - 它永远不会完成。
知道我在这里做错了什么吗?
这是因为您正在使用.switchMap
,如果在发出下一个可观察量之前尚未完成,它将取消上一个可观察量。调用第一个loadChildren
,当第二个调用在完成之前调用时,将取消第一个调用。
您可以改用.mergeMap
,这将允许您并行运行多个loadChildren
调用。请记住,这消除了重复请求的自动取消,因此如果您需要这样的功能,则必须自己处理它。