多个连续效果没有完成?
Multiple successive effects not completing?
我不确定这个 post 的标题是否很好地解释了我的问题,但这是我的情况。
我有一棵延迟加载的树 children。当您展开一个树节点时,它会分派一个 LoadChildrenAction
和刚刚作为有效负载展开的 parent 节点。
这是我的效果:
@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
已发送,在我的减速器中我更新了树。
但是,如果我展开一个节点,然后在第一个操作完成之前展开另一个节点,只有最后一个操作完成。
也就是说,我展开一个节点,然后在第一个节点还在加载的时候,立即展开另一个节点。第二个树节点更新了它的 child 内容,但第一个从不更新。事实上,有两个 LoadChildrenAction
被调度 - 每个扩展一个 - 但只有 一个 LoadChildrenSuccessAction
被调度。
如果我将 console.log
放入 categoryService.loadChildren
函数中,它会被记录两次 - 因此该服务会被调用两次。但是只有一个动作被调度,所以我失去了第一个动作 - 它永远不会完成。
知道我做错了什么吗?
这是因为您正在使用 .switchMap
,如果它在下一个可观察对象发出之前尚未完成,它将取消前一个可观察对象。第一个 loadChildren
被调用,当第二个在完成之前被调用时,第一个调用被取消。
您可以改用 .mergeMap
,这样您就可以 运行 并行调用多个 loadChildren
。请记住,这会删除重复请求的自动取消功能,因此如果您需要这样的功能,则必须自己处理。
我不确定这个 post 的标题是否很好地解释了我的问题,但这是我的情况。
我有一棵延迟加载的树 children。当您展开一个树节点时,它会分派一个 LoadChildrenAction
和刚刚作为有效负载展开的 parent 节点。
这是我的效果:
@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
已发送,在我的减速器中我更新了树。
但是,如果我展开一个节点,然后在第一个操作完成之前展开另一个节点,只有最后一个操作完成。
也就是说,我展开一个节点,然后在第一个节点还在加载的时候,立即展开另一个节点。第二个树节点更新了它的 child 内容,但第一个从不更新。事实上,有两个 LoadChildrenAction
被调度 - 每个扩展一个 - 但只有 一个 LoadChildrenSuccessAction
被调度。
如果我将 console.log
放入 categoryService.loadChildren
函数中,它会被记录两次 - 因此该服务会被调用两次。但是只有一个动作被调度,所以我失去了第一个动作 - 它永远不会完成。
知道我做错了什么吗?
这是因为您正在使用 .switchMap
,如果它在下一个可观察对象发出之前尚未完成,它将取消前一个可观察对象。第一个 loadChildren
被调用,当第二个在完成之前被调用时,第一个调用被取消。
您可以改用 .mergeMap
,这样您就可以 运行 并行调用多个 loadChildren
。请记住,这会删除重复请求的自动取消功能,因此如果您需要这样的功能,则必须自己处理。