按顺序派遣乘法动作 - ngrx

时间:2017-04-20 07:50:27

标签: 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)
    .map(action => new LayoutActions.IsLoading(true))
    .switchMap(() => this.clientService.getClients())
    .map(clients => new ClientActions.GetClientsReceived(clients));

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

3 个答案:

答案 0 :(得分:4)

您的observable发出的每个动作都将被调度,因此您需要将动作映射到多个动作。您可以在startWith()上添加switchMap()加载操作:

.switchMap(action => {
  this.clientService.getClients()
    .map(clients => new ClientActions.GetClientsReceived(clients) as Action)
    .startWith(new LayoutActions.IsLoading(true))
);

有时打字可能有误,打字稿会使用您的操作的特定类型而不是Action。在这种情况下,在地图之后,Observable被输入为Observable<ClientActionReceived>,因此返回LayoutActionLoading内部的startWith似乎对于打字稿是错误的。
为避免这种情况,您需要将其中一个投射为Action,以便它知道它是Observable<Action>

答案 1 :(得分:0)

您可以使用do运算符。

实施例: genome.genes

答案 2 :(得分:0)

我是这样做的:

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: {}}
 ));