我想在所有动作发生后触发一个动作。这是我的代码:
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$
实际上,它是一个永远不会完成的主题(这意味着它不能再发出任何动作)。同样的情况是与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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句