2 observable rxjs redux ngrx ngrx-effects
要旨
我有一个效果,可通过多个API请求加载产品的评论:
@Effect()
loadOfProduct$ = this.actions$.pipe(
ofType<ReviewsActions.LoadOfProduct>(ReviewsActions.Types.LOAD_OF_PRODUCT),
map(action => action.payload),
switchMap((productId: string) => {
return this.reviewsService.loadOfProduct(productId);
}),
switchMap((reviews: Review[]) => {
return forkJoin([
of(reviews),
this.productsService.loadManyById(reviews.map(r => r.productId)),
this.usersService.loadManyById(reviews.map(r => r.writerId)),
]);
}),
switchMap((data: any) => {
const [reviews, products, users] = data;
return [
new ProductsActions.LoadManyByIdSuccess(products),
new UsersActions.LoadManyByIdSuccess(users),
new ReviewsActions.LoadOfProductSuccess(reviews),
];
}),
catchError(error => of(new ReviewsActions.LoadOfProductFail({
...error.error,
// I need the productId here!!!
// payload: productId,
}))),
);
Run Code Online (Sandbox Code Playgroud)
问题
问题是,我不知道如何访问productId从第一个字符串switchMap中catchError
只需将下一个运算符嵌套在第一个switchMap下:
@Effect() loadOfProduct$ = this.actions$
.pipe(
ofType<ReviewsActions.LoadOfProduct>(ReviewsActions.Types.LOAD_OF_PRODUCT),
switchMap((action) => {
const productId = action.payload;
return this.reviewsService.loadOfProduct(productId)
.pipe(
switchMap((reviews: Review[]) => {
return forkJoin([
of(reviews),
this.productsService.loadManyById(reviews.map(r => r.productId)),
this.usersService.loadManyById(reviews.map(r => r.writerId)),
]);
}),
switchMap((data: any) => {
const [reviews, products, users] = data;
return [
new ProductsActions.LoadManyByIdSuccess(products),
new UsersActions.LoadManyByIdSuccess(users),
new ReviewsActions.LoadOfProductSuccess(reviews),
];
}),
catchError(error => of(new ReviewsActions.LoadOfProductFail({
...error.error,
// now you have the productId
// payload: productId,
})))
);
})
);
Run Code Online (Sandbox Code Playgroud)
或者,如果reviewsService.loadOfProduct方法返回一个Promise:
return from(this.reviewsService.loadOfProduct(productId)) // originally fromPromise
.pipe(...)
Run Code Online (Sandbox Code Playgroud)
这也是处理特效内部错误的正确方法,因为在原始代码中,如果发生错误,即使已进入catchError运算符,“特效”也将停止工作。
有关更多信息,请查看ngrx效果错误处理。
| 归档时间: |
|
| 查看次数: |
982 次 |
| 最近记录: |