Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript NgRx-仅当返回前一个服务呼叫响应时,我应该如何触发服务呼叫_Javascript_Angular_Rxjs_Ngrx - Fatal编程技术网

Javascript NgRx-仅当返回前一个服务呼叫响应时,我应该如何触发服务呼叫

Javascript NgRx-仅当返回前一个服务呼叫响应时,我应该如何触发服务呼叫,javascript,angular,rxjs,ngrx,Javascript,Angular,Rxjs,Ngrx,我使用的是ngrx5,示例效果代码如下所示 我们有一个更新的客户infom用户案例。用户触发许多操作(saveCustomerAction),一旦发出操作,就会触发相应的Rest服务调用 例如,触发三个服务调用(this.customerService.updateCustomer)来更新客户信息。他们几乎同时开火。它不适用于我的应用程序 因为,我们使用版本号进行并发检查。第一次服务呼叫将返回更新的版本号,第二次服务呼叫需要该版本号以更新客户信息 这意味着我必须等待第一个服务呼叫响应,然后进行第

我使用的是ngrx5,示例效果代码如下所示

我们有一个更新的客户infom用户案例。用户触发许多操作(saveCustomerAction),一旦发出操作,就会触发相应的Rest服务调用

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

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

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

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

有什么建议吗

多谢各位

@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) => {
             . . .
            })
        );
        }))

您可以做的是对您的每个服务响应
成功
错误
产生影响,这样您就可以根据您的任何一个服务响应的结果轻松地进行多种操作

因此,让更多的动作分别代表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)))
        );
    })
  );

这样做可以使阅读和跟踪变得非常容易,当出现错误时,函数足够小,可以了解您可能遇到的问题。

您好,谢谢您的回答,这两种效果之间有什么不同?谢谢。不同之处在于每种效果所等待的操作。一个是
saveCustomerAction
,另一个是
saveCustomerSuccessAction