Angular ngrx-带有错误处理的效果链接:如果第一个api获取成功,则从第二个api获取数据
我看到了一些所谓的答案,还有一些中篇文章,但这些仍然不能解决我目前的问题 情景:Angular ngrx-带有错误处理的效果链接:如果第一个api获取成功,则从第二个api获取数据,angular,error-handling,ngrx,chaining,ngrx-effects,Angular,Error Handling,Ngrx,Chaining,Ngrx Effects,我看到了一些所谓的答案,还有一些中篇文章,但这些仍然不能解决我目前的问题 情景: 添加一个产品 如果成功,获取所有产品的列表 这两种情况都可能有错误: 业务错误,包含特定于业务的错误消息 网络错误,一般的东西,比如40x错误码等等 目前,我的效果是使用服务添加产品,并根据操作的成功与失败来分派操作。这将更新存储,将currentProduct设置为添加的产品 @Effect() addProduct$: Observable<Action> = this.actions$.p
@Effect()
addProduct$: Observable<Action> = this.actions$.pipe(
ofType(AddProductAction),
map((action: AddProductAction) => action.payload),
switchMap((ProductToAdd: Product) =>
this.productService.addProduct(ProductToAdd).pipe(
map(response => {
if (this.responseContainsBusinessError(response)) {
return new AddProductBusinessError(response);
} else { // no business error
return new AddProductSuccess(response);
}
}),
catchError(err => of(new AddProductFail(err))) // network/http error etc
)
)
);
@Effect()
addProduct$:Observable=此.actions$.pipe(
类型(AddProductAction),
map((action:AddProductAction)=>action.payload),
开关映射((ProductToAdd:Product)=>
此.productService.addProduct(ProductToAdd).pipe(
映射(响应=>{
如果(此响应包含业务错误(响应)){
返回新的AddProductBusinessError(响应);
}else{//无业务错误
返回新的AddProductSuccess(响应);
}
}),
catchError(err=>of(new AddProductFail(err))//网络/http错误等
)
)
);
是否有人可以演示如何更改此代码,以便我可以添加第二个effect/api调用以从服务器获取产品列表?只需添加另一个@effect,它将在
AddProductSuccess
上触发
@Effect()
listAllProducts$: Observable<Action> = this.actions$.pipe(
ofType(AddProductSuccess),
....
@Effect()
listAllProducts$:Observable=此.actions$.pipe(
类型(AddProductSuccess),
....
我建议使用mergeMap
并分派一系列操作:[new AddProductSuccess(response),new LoadProductsRequest()]
这样,你的addProduct$
效果就不会变得杂乱无章,而且你还有一个可重用的LoadProducts
效果。如何调度包含错误处理部分的数组?我发布的链接使用了带有开关映射的数组,我了解数组部分,但不知道如何将我的错误处理与之结合使用mergeMap
而不是map
,然后您可以返回一个数组。这是一个好主意,但我认为此解决方案的问题是,这样您无法对第一个效果的结果做出反应。如果添加新产品的第一个API调用失败,您就不想请求产品列表。(如果我理解正确的话。)如果API以这种方式失败,您将不会请求产品列表。仅当满足条件(成功检索产品)时,才会从第一个效果中的return new AddProductSuccess(response);
触发该效果。如果发生错误,将不再执行任何操作(不会触发listAllProducts$effect)@avramz你说得对,我仔细阅读了效果名称。保存添加的产品应该仍然是可能的。听起来对我来说是一个很好的解决方案。