多个连续效果没有完成?

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。请记住,这会删除重复请求的自动取消功能,因此如果您需要这样的功能,则必须自己处理。