在 redux-observable 史诗中的所有动作之后触发一个动作

Fire an action after all actions in redux-observable epic

我想在所有动作发生后触发一个动作。这是我的代码:

 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   
   }

我想在捕获成功或出错后隐藏加载。但它没有 concat 最后的操作。在 addCategories().

之前,我可以看到一切正常

但是它不会调用 concat

您所拥有的将不起作用,因为 concat 仅在源 Observable 完成后才订阅其内部 Observable。 action$ 实际上是一个永远不会完成的 Subject(这意味着它不能再发出任何动作)。您拥有的 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 returns 是什么。 mergeMap 在一个数组上只会将它展平,这可能是你想要做的(但是对于一个数组项你可以只使用 map)?

顺便说一句,请注意您混合使用了管道操作符和原型操作符:https://github.com/ReactiveX/rxjs/blob/master/doc/pipeable-operators.md