2017-06-16 1 views
0

Peut-on attendre deux actions comme Promise.all? Exemple:Comment attendre 2 actions dans @ ngrx/effects

@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(); 
     }); 
} 

À JOUR Ce que je veux obtenir un comportement simillar à Promise.all. Comment envoyer deux effets en parallèle, attendez que tous les effets soient résolus, puis envoyez une troisième action. Quelque chose comme https://redux-saga.js.org/docs/advanced/RunningTasksInParallel.html Avec des promesses, il était tout à fait obviouse:

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

Est-il possible dans NGRX/effets? Ou est-ce un mauvais moyen dans ngrx/effets?

MISE À JOUR

Mettez une réponse ci-dessous.

+1

Votre question est pas claire. Pouvez-vous fournir plus de détails? –

Répondre

0

Peut-être quelque chose comme:

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 va créer une observable qui émet une valeur en toutes les dernières valeurs emited par un ensemble de facteurs observables. Pour plus d'informations vérifiez this link

+0

Ce qui devrait être dans ... observables? –

+0

Ce que vous voulez attendre. Que voulez-vous archiver? Votre question n'est pas assez spécifique –

+0

Voici comment je le ferais aussi – pixelbits

0

L'utilisation de Observable.combineLatest fonctionne pour moi.

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

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

take (1) résultats dans l'envoi Action3() une seule fois.

0

moi répondues ici: https://stackoverflow.com/a/48783384/7251821 copie:

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()); 
     ]; 
    });