在redux-observable epic

时间:2018-06-13 09:08:43

标签: angular rxjs redux-observable

我想在所有行动发生后开始行动。这是我的代码:

 public fetchCategories(action$: Observable<ICategoryAction>, store: Store<IAppState>) {
    return action$.pipe(
      ofType(CategoryActionType.FETCH_CATEGORIES),
      switchMap((action) => {
         return this._categoryService.list(action.payload)
      }),
      flatMap(data => [
        this._categoryAction.addCategories(new Categories(data)),
      ])
    ).catch((error) => {
      return Observable.of(this._commonAction.showError(error));
    })
    .concat(Observable.of(this._commonAction.hideLoading())); // <<== Doesn't work   
   }

我想隐藏成功后的加载或catch中的错误。但它并没有concat最后的行动。我可以看到一切正常,直到addCategories()

但是,它不会调用concat

1 个答案:

答案 0 :(得分:0)

由于concat仅在源Observable完成后才订阅其内部Observable,因此您将无法工作。 action$实际上是一个永远不会完成的主题(这意味着它不能再发出任何动作)。同样的情况是你拥有的catch

这在很大程度上取决于您的行为结构,但您可以采取以下措施:

action$.pipe(
  ofType(CategoryActionType.FETCH_CATEGORIES),
    switchMap((action) => this._categoryService.list(action.payload)
      .pipe(
        catchError(() => of(this._commonAction.showError(error)))
      ),
    }),
    mergeMap(data => [
      this._categoryAction.addCategories(new Categories(data)),
      of(this._commonAction.hideLoading()),
    ])

我实际上猜测你的代码应该做什么,因为我不知道.addCategories返回什么。数组上的mergeMap只会展平它,这可能是想做的(但只有一个数组项,你只能使用map)?

请注意,您正在混合pipable和原型运算符:https://github.com/ReactiveX/rxjs/blob/master/doc/pipeable-operators.md

相关问题