2017-06-16 15 views
0

是否可以等待兩個動作,如Promise.all?例如:如何等待@ ngrx/effects中的2個動作

@Effect() 
pulic addUser() { 
    return this.actions$.ofType(user.ADD) 
     .switchMap(() => { 
     return this.userService.add(); 
     }) 
     .map(() => { 
     return new user.AddSuccessAction(); 
     }); 
} 

@Effect() 
pulic addUserOptions() { 
    return this.actions$.ofType(userOptions.ADD) 
     .switchMap(() => { 
     return this.userOptionsService.add(); 
     }) 
     .map(() => { 
     return new userOptions.AddSuccessAction(); 
     }); 
} 

@Effect() 
public complete() { 
    return this.actions$.ofType(user.ADD_SUCCESS, userOptions.ADD_SUCCESS) 
     // how to make it works like Promise.all ? 
     .switchMap(() => { 
     return this.statisticService.add(); 
     }) 
     .map(() => { 
     return new account.CompleteAction(); 
     }); 
} 

修訂 我想實現的是呈三角行爲Promise.all。如何並行分配兩個效果,等到所有效果都解決後再發送第三個動作。像https://redux-saga.js.org/docs/advanced/RunningTasksInParallel.html一些與承諾這是相當obviouse:

Promise.all([fetch1, fetch2]).then(fetch3); 

是否有可能在NGRX /效果?或者在ngrx/effects中是錯誤的方法?

修訂

把答案如下。

+1

你的問題不明確。你能提供更多細節嗎? –

回答

0

也許是這樣的:

import { forkJoin } from 'rxjs/observable/forkJoin'; 

@Effect() 
someEffect$:Observable<Action> = this.actions$ 
     .ofType(user.ADD_SUCCESS, userOptions.ADD_SUCCESS) 
     .mergeMap(()=> forkJoin(...observables)) 
     .map(() => { 
     return new account.CompleteAction(); 
     }); 

ForkJoin將創建一個可觀察的,將發出由一個可觀測值的emited所有的最後的值的值。欲瞭解更多信息,請點擊this link

+0

什麼應該在... observables? –

+0

你想等什麼。你想要做什麼?你的問題還沒有足夠詳細 –

+0

這也是我該怎麼做的 – pixelbits

0

使用Observable.combineLatest適合我。

@Effect() 
    complete$ = this.actions$.ofType<Action1>(ACTION1).combineLatest(this.actions$.ofType<Action2>(ACTION2), 
    (action1, action2) => { 

     return new Action3(); 
    } 
).take(1); 

取(1)導致只調度一次Action3()。

0

回答我在這裏:https://stackoverflow.com/a/48783384/7251821 副本:

return this.actions$.ofType(user.SIGN_UP_SUCCESS) 
    .map((action: user.SignUpSuccessAction) => action.payload) 
    .mergeMap(() => { 
     const userOptionsAdd$ = this.actions$.ofType(userOptions.ADD_SUCCESS); 
     const userInfoAdd$ = this.actions$.ofType(userInfo.ADD_SUCCESS); 

     Observable.forkJoin(userOptionsAdd$, userInfoAdd$) 
      .first() 
      .subscribe(() => this.router.navigateByUrl("dashboard")); 

     return [ 
      new userOptions.Add(new UserOptionsModel()); 
      new userInfo.Add(new UserInfoModel()); 
     ]; 
    });