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

我看到了一些所谓的答案,还有一些中篇文章,但这些仍然不能解决我目前的问题

情景:

  • 添加一个产品
  • 如果成功,获取所有产品的列表
  • 这两种情况都可能有错误:

  • 业务错误,包含特定于业务的错误消息
  • 网络错误,一般的东西,比如40x错误码等等
  • 目前,我的效果是使用服务添加产品,并根据操作的成功与失败来分派操作。这将更新存储,将currentProduct设置为添加的产品

      @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你说得对,我仔细阅读了效果名称。保存添加的产品应该仍然是可能的。听起来对我来说是一个很好的解决方案。