【问题标题】:ngrx - effects chaining with error handling : fetch data from second api if first api fetch was successfulngrx - 带有错误处理的效果链接:如果第一个 api 获取成功,则从第二个 api 获取数据
【发布时间】:2019-03-07 10:07:22
【问题描述】:

我看到了一些 SO 答案,以及 this 中等帖子,但这些仍然不能解决我当前的问题。

场景:

  1. 添加产品。
  2. 如果成功,获取所有产品的列表。

这两种情况都可能有错误:

  1. 业务错误,包含业务特定的错误消息
  2. 网络错误、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
      )
    )
  );

有人可以说明如何更改此代码,以便我可以添加第二个效果/api 调用以从服务器获取产品列表吗?

【问题讨论】:

  • 我建议使用mergeMap 并调度一系列动作:[new AddProductSuccess(response), new LoadProductsRequest()] 这样,您的addProduct$ 效果就不会变得混乱,而且您还拥有一个可重复使用的LoadProducts 效果。
  • 如何调度包含错误处理部分的数组?我发布的链接使用了一个带有 switchmap 的数组,我理解了数组部分,但不知道如何将我的错误处理与它结合起来
  • 只要用mergeMap代替map就可以返回一个数组了。

标签: angular error-handling ngrx chaining ngrx-effects


【解决方案1】:

只需添加另一个@Effect,它将在AddProductSuccess 上触发。

@Effect()
  listAllProducts$: Observable<Action> = this.actions$.pipe(
    ofType(AddProductSuccess),
    ....

【讨论】:

  • 这是个好主意,但我认为这个解决方案的问题是,这样你就不能对第一个效果的结果做出反应。如果添加新产品的第一个 API 调用失败,您不想请求产品列表。 (如果我理解正确的话。)
  • 如果 API 以这种方式失败,您将不会请求产品列表。效果将在您的第一个效果中从return new AddProductSuccess(response); 触发,前提是满足条件(成功检索产品)。如果发生错误,将不再做任何事情(不会触发 listAllProducts$ 效果)
  • @avramz 你说得对,我读过效果名称。应该仍然可以保存添加的产品。听起来对我来说是一个很好的解决方案。
猜你喜欢
  • 1970-01-01
  • 2019-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多