Redux NGRX/效果将数据传递到catchError
要点 我有一种效果,通过多个API请求加载对产品的审查:Redux NGRX/效果将数据传递到catchError,redux,rxjs,observable,ngrx,ngrx-effects,Redux,Rxjs,Observable,Ngrx,Ngrx Effects,要点 我有一种效果,通过多个API请求加载对产品的审查: @Effect() loadOfProduct$ = this.actions$.pipe( ofType<ReviewsActions.LoadOfProduct>(ReviewsActions.Types.LOAD_OF_PRODUCT), map(action => action.payload), switchMap((productId: string)
@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,
}))),
);
@Effect()
loadOfProduct$=此.actions$.pipe(
类型(产品的ReviewActions.Types.LOAD_),
映射(action=>action.payload),
switchMap((productId:string)=>{
返回此.reviewsService.loadOfProduct(productId);
}),
switchMap((评论:评论[])=>{
返回叉连接([
(检讨),
this.productsService.loadManyById(reviews.map(r=>r.productId)),
this.usersService.loadManyById(reviews.map(r=>r.writerId)),
]);
}),
switchMap((数据:任意)=>{
const[评论、产品、用户]=数据;
返回[
新产品操作。加载多个YIDSuccess(产品),
新UsersActions.LoadManyBydSuccess(用户),
新的ReviewActions.LoadOfProductSuccess(评论),
];
}),
catchError(错误=>of(新的ReviewActions.LoadOfProductFail({
…错误,错误,
//我需要这里的productId!!!
//有效载荷:productId,
}))),
);
问题
问题是,我不知道如何从
catchError
中的第一个switchMap
访问productId
字符串,只需将下一个操作符嵌套在第一个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,
})))
);
})
);
这也是处理效果内部错误的正确方法,因为在原始代码中,如果出现错误,“效果”将停止工作,即使它输入了catchError操作符
要了解更多信息,请查看
return from(this.reviewsService.loadOfProduct(productId)) // originally fromPromise
.pipe(...)