【问题标题】:Multiple successive effects not completing?多个连续效果未完成?
【发布时间】:2017-12-21 16:57:31
【问题描述】:

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

我有一棵树,上面有懒洋洋的孩子。当您展开一个树节点时,它会将一个 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 已调度,并在我的减速器中更新树。

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

也就是说,我展开一个节点,然后在第一个节点还在加载的时候立即展开另一个节点。第二个树节点使用其子内容进行更新,但第一个从未更新。事实上,两个 LoadChildrenActions 被分派 - 每个扩展一个 - 但只有 一个 LoadChildrenSuccessAction 被分派。

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

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

【问题讨论】:

标签: angular typescript rxjs ngrx ngrx-effects


【解决方案1】:

这是因为您正在使用.switchMap,如果在发出下一个 observable 之前它还没有完成,它将取消前一个 observable。第一个 loadChildren 被调用,当第二个在它完成之前被调用时,第一个调用被取消。

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

【讨论】:

  • 谢谢!这解决了问题。我想我还有很多东西要学习 RxJS。
猜你喜欢
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
  • 2016-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多