我想知道如何在我的效果中按顺序发送多个动作。
@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()方法和最后一个操作正常工作。
答案 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: {}}
));