我想在所有行动发生后开始行动。这是我的代码:
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
。
答案 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