NgRx-仅当返回上一个服务呼叫响应时,才应该触发服务呼叫

时间:2018-08-17 02:44:21

标签: javascript angular rxjs ngrx

我正在使用ngrx5,效果代码如下所示。

我们有一个更新的客户信息用户案例。用户触发了多个动作(SaveCustomersAction),一旦发出动作,就会触发相应的Rest服务调用。

例如,将触发三个服务调用(this.customerService.updateCustomer)以更新客户信息。他们几乎在同一时间开除了。它不适用于我的应用程序。

因为,我们使用版本号进行并发检查。更新的版本号将从第一个服务呼叫返回,第二个服务呼叫需要该版本号才能更新客户信息。

这意味着我必须等待第一个服务呼叫响应,然后再进行第二个服务呼叫。之后,等待第二个服务呼叫响应,然后触发第三个。

我的问题是,仅当在Ngrx效果中返回上一个服务调用响应时,才应该触发服务调用?或如何将动作链接在一起,即仅解决第一个动作就调度第二个动作?

有什么建议吗?

谢谢

@Effect()
      updateCustomerInfo$ = this.actions$.pipe(
        ofType(CustomerActionTypes.SaveCustomersAction),
        switchMap((action: customerActions.SaveCustomersAction) => {
          return this.customerService.updateCustomer(action.payload).pipe(
            map(result => {
              return new customerActions.SaveCustomersSuccessAction({
                Edition: {customerId: result.Id, edition: result.edition},
                Customers: action.payload.Customers
              });
            }),
            catchError ( (error) => {
             . . .
            })
        );
        }))

1 个答案:

答案 0 :(得分:0)

您可以做的是对您的每个服务响应successerror都有影响,这样您就可以轻松地根据任何一个服务响应的结果来做多件事。

进行更多操作,每个操作代表API调用的开始和结束。

  @Effect()
  SaveCustomer$ = this.actions$.ofType(SaveCustomersAction).pipe(
    concatMap(() => {
      return this.customerService.updateCustomer(action.payload)
        .pipe(
          map(pizzas => new SaveCustomersSuccessAction({})),
          catchError(error => of(new SomeError(error)))
        );
    })
  );

  @Effect()
  AfterUpdateCustomer$ = this.actions$.ofType(SaveCustomersSuccessAction).pipe(
    map((action: myOtherInterface) => action.payload),
    concatMap(payload => {
      return this.myService
        .doSomething(payload)
        .pipe(
          map(data => new MyAwesomeness(data)),
          catchError(error => of(new myAwesomeError(error)))
        );
    })
  );

以这种方式进行操作使阅读和跟踪变得非常容易,并且当出现错误时,该功能足够小以至于您可能会遇到问题。