angular - 多个连续效果未完成?

标签 angular typescript rxjs ngrx ngrx-effects

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

我有一棵树,里面有延迟加载的 child 。当您伸展树(Splay Tree)节点时,它会调度 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 已调度,并在我的 reducer 中更新树。

但是,如果我展开一个节点,然后在第一个操作完成之前展开另一个节点,则只有最后一个操作完成。

也就是说,我展开一个节点,然后在第一个节点仍在加载时立即展开另一个节点。第二个树节点会使用其子内容进行更新,但第一个树节点永远不会更新。事实上,两个 LoadChildrenAction 被调度 - 每个扩展一个 - 但只有一个 LoadChildrenSuccessAction 被调度。

如果我将 console.log 放入我的 categoryService.loadChildren 函数中,它会被记录两次 - 因此该服务被调用两次。但只有一个操作被调度,所以我丢失了第一个操作 - 它永远不会完成。

知道我在这里做错了什么吗?

最佳答案

这是因为您正在使用 .switchMap ,如果在发出下一个可观察值之前尚未完成,它将取消上一个可观察值。第一个 loadChildren 被调用,当第二个在完成之前被调用时,第一个调用将被取消。

您可以使用 .mergeMap 来代替,这将允许您并行运行 loadChildren 的多个调用。请记住,这会消除重复请求的自动取消功能,因此如果您需要类似的功能,则必须自行处理。

关于angular - 多个连续效果未完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47929512/

相关文章:

Angular 2 单元测试服务 stub 值不会改变?

angular - 如何在组件中调用服务?

javascript - Angular 4 : router. navigate() 不能确保停止执行其余代码

javascript - 如何在 Chrome 开发工具中调试 ionic3 TypeScript 代码

javascript - Angular 2 标题和数据

javascript - 在C#中序列化为JSON并在TS中反序列化

javascript - 页面重新加载后,Eventemitter 更改消失

rxjs - 使用推荐的运算符导入调用 RxJS 共享时遇到问题

javascript - RxJS 每 x 秒从数组发出值,使用该值调用函数,如果失败则重试

angular - 使用 rxjs 进行垫排序无法正常工作