多个连续效果未完成?



我不确定这篇文章的标题是否很好地解释了我的问题,但这是我的情况。

我有一棵树,里面有懒洋洋的孩子。展开树节点时,它会调度一个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调用。请记住,这消除了重复请求的自动取消,因此如果您需要这样的功能,则必须自己处理它。

相关内容

  • 没有找到相关文章

最新更新