Redux NGRX/效果将数据传递到catchError

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)

要点

我有一种效果,通过多个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,
        }))),
    );
@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(...)