我正在使用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) => {
. . .
})
);
}))
答案 0 :(得分:0)
您可以做的是对您的每个服务响应success
和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)))
);
})
);
以这种方式进行操作使阅读和跟踪变得非常容易,并且当出现错误时,该功能足够小以至于您可能会遇到问题。