2017-04-20 222 views
0

我想知道如何在我的效果中按順序調度乘法操作。按順序調度乘法操作 - ngrx

@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()方法和最後一個操作正常工作。

回答

4

你觀察到的發出每一個動作都會被髮送,所以你需要的是映射到多個動作的動作。你可以通過添加與startWith()裝載處理您switchMap()

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

有時分型可能是錯的,打字稿作者會使用特定類型的行動,而不是Action的。在這種情況下,在地圖之後,Observable鍵入爲Observable<ClientActionReceived>,因此在startingWith中返回LayoutActionLoading似乎對於打字稿不正確。
爲了避免出現這種情況,您需要將其中的一個作爲Action,以便知道它是Observable<Action>

+0

爲了防止打字稿錯誤,我需要修改的最後一行.startWith(新LayoutActions.IsLoading(真))。如果你可以在你的答案中加入,那會很好。 –

+0

我已經添加了關於該輸入問題的一些解釋 – Ghetolay

0

您可以使用do操作符。

例子: .do(dispatchAction(...))

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