在 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
我想在所有动作发生后触发一个动作。这是我的代码:
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