Angular 按有效顺序分派多个行动-ngrx

Angular 按有效顺序分派多个行动-ngrx,angular,ngrx,ngrx-effects,Angular,Ngrx,Ngrx Effects,我想知道如何在效果上按顺序分配多重动作 @Effect() getClients$: Observable<Action> = this.actions$ .ofType(ClientActions.GET_CLIENTS) .withLatestFrom(this.store.select(fromRoot.getClients)) .filter(([action, clients]) => clients.length === 0)

我想知道如何在效果上按顺序分配多重动作

  @Effect()
  getClients$: Observable<Action> = this.actions$
    .ofType(ClientActions.GET_CLIENTS)
    .withLatestFrom(this.store.select(fromRoot.getClients))
    .filter(([action, clients]) => clients.length === 0)
    .map(action => new LayoutActions.IsLoading(true))
    .switchMap(() => this.clientService.getClients())
    .map(clients => new ClientActions.GetClientsReceived(clients));
@Effect()
getClients$:Observable=this.actions$
.of类型(ClientActions.GET_客户端)
.withLatestFrom(this.store.select(fromRoot.getClients))
.filter(([action,Client])=>clients.length==0)
.map(action=>newlayoutactions.IsLoading(true))
.switchMap(()=>this.clientService.getClients())
.map(clients=>newclientactions.GetClientsReceived(clients));

在上面的示例中,第一个操作未被调度。getClients()方法和最后一个操作工作正常

您可以使用do操作符

例如:
.do(dispatchAction(…)
您可以使用do操作符

例如:
.do(dispatchAction(…)
可观察对象发出的每个动作都将被调度,因此您需要的是将一个动作映射到多个动作。通过在
switchMap()
上添加带有
startWith()
的加载操作,可以做到这一点:

有时打字可能会出错,typescript将使用操作的特定类型,而不是
操作
。在这种情况下,在映射之后,可观察对象被键入为
Observable
,因此在startWith中返回
layoutactionload
,对于typescript来说似乎是错误的。

为了避免这种情况,您需要将这两个动作中的一个转换为
动作
,这样它就会知道这是一个
可观察的动作
,可观察的动作发出的每个动作都将被调度,所以您需要的是将一个动作映射到多个动作。通过在
switchMap()
上添加带有
startWith()
的加载操作,可以做到这一点:

有时打字可能会出错,typescript将使用操作的特定类型,而不是
操作
。在这种情况下,在映射之后,可观察对象被键入为
Observable
,因此在startWith中返回
layoutactionload
,对于typescript来说似乎是错误的。

为了避免这种情况,您需要将其中一个转换为
操作
,这样它就知道这是一个
可观察的

我就是这样做的:

userRoleChange$: Observable<Action> = this.actions$
 .ofType(userActions.USER_SWITCH_ROLE)
 .switchMap(() => Observable.of(
   {type: preFlightActions.PRE_FLIGHT_CLEAR, payload: {}},
   {type: detailPlanningActions.DETAIL_PLANNING_CLEAR, payload: {}},
   {type: uploadsActions.UPLOAD_FILTER_SET, payload: {}}
 ));
userRoleChange$:Observable=this.actions$
.of类型(userActions.USER\u开关\u角色)
.switchMap(()=>可观察的(
{type:preFlightActions.PRE_flightu_CLEAR,有效载荷:{},
{type:detailPlanningActions.DETAIL\u PLANNING\u CLEAR,有效负载:{},
{type:uploadsActions.UPLOAD_FILTER_SET,有效负载:{}
));

我就是这样做的:

userRoleChange$: Observable<Action> = this.actions$
 .ofType(userActions.USER_SWITCH_ROLE)
 .switchMap(() => Observable.of(
   {type: preFlightActions.PRE_FLIGHT_CLEAR, payload: {}},
   {type: detailPlanningActions.DETAIL_PLANNING_CLEAR, payload: {}},
   {type: uploadsActions.UPLOAD_FILTER_SET, payload: {}}
 ));
userRoleChange$:Observable=this.actions$
.of类型(userActions.USER\u开关\u角色)
.switchMap(()=>可观察的(
{type:preFlightActions.PRE_flightu_CLEAR,有效载荷:{},
{type:detailPlanningActions.DETAIL\u PLANNING\u CLEAR,有效负载:{},
{type:uploadsActions.UPLOAD_FILTER_SET,有效负载:{}
));

为了防止类型脚本错误,我需要将最后一行修改为.startWith(new layoutations.IsLoading(true))。如果您能在回答中添加这一点,那就太好了。我已经添加了一些关于键入问题的解释,以防止在将最后一行修改为.startWith(new layoutations.IsLoading(true))时出现键入脚本错误。如果你能在回答中加上这一点,那就太好了。我已经对打字问题做了一些解释