2017-02-16 1 views
1

Tout d'abord, de nombreux accessoires pour cette superbe bibliothèque! Je suis toujours aux prises avec un cas d'utilisation. Je voudrais d'abord appeler une autre épopée et attendre qu'elle se termine avant de continuer l'épopée actuelle. Disons que j'ai un formulaire où un utilisateur peut changer les choses. Avant de charger d'autres données dans le formulaire, je souhaite d'abord enregistrer les modifications en cours. Des pensées à ce sujet?Invoquer des épopées à partir d'autres épopées

Répondre

3

Sonne comme vous voulez: si une épopée veut lancer une autre épopée et attendez qu'elle se termine avant de continuer. Une approche est (en utilisant des noms de pseudo), lors de la réception de l'action initiale LOAD_OTHER_DATA vous commencez immédiatement à écouter un seul SAVE_FORM_FULFILLED, qui signale que le formulaire a été enregistré (nous allons le lancer dans un peu). Lors de la réception, nous mergeMap (ou switchMap, peu importe dans ce cas) que dans notre appel à charger les autres données loadOtherDataSomehow() et faire les affaires habituelles. Enfin, l'astuce pour lancer la sauvegarde réelle du formulaire que nous attendons est d'ajouter un startWith() à la fin de cette chaîne entière - qui émettra et enverra l'action pour réellement enregistrer le formulaire.

const saveFormEpic = (action$, store) => 
    action$ 
    .ofType('SAVE_FORM') 
    .switchMap(() => 
     saveFormSomeHow(store.getState().formDataSomewhere) 
     .map(details => ({ 
      type: 'SAVE_FORM_FULFILLED' 
     })) 
    ); 

const loadOtherDataEpic = action$ => 
    action$ 
    .ofType('LOAD_OTHER_DATA') 
    .switchMap(() => 
     action$.ofType('SAVE_FORM_FULFILLED') 
     .take(1) // don't listen forever! IMPORTANT! 
     .mergeMap(() => 
      loadOtherDataSomeHow() 
      .map(otherData => ({ 
       type: 'LOAD_OTHER_DATA_FULFILLED', 
       payload: otherData 
      })) 
     ) 
     .startWith({ 
      type: 'SAVE_FORM' 
     }) 
    ); 

Vous n'avez pas mentionné la façon dont votre chargement et travaux d'économie, c'est donc juste code pseudo que vous aurez besoin de modifier pour votre cas d'utilisation.

+0

wow merci pour la réponse complète! Puis-je avoir une petite question supplémentaire en plus? La sauvegarde est optionnelle comme dans "quand l'utilisateur ne l'a pas sauvegardé seul je voudrais que l'épopée le fasse pour lui". J'ai donc regardé la méthode Observer.if() et cela ressemble à ça, mais je ne peux pas le faire en option dans le "loadOtherDataEpc". – robinvdvleuten

+0

Juste utiliser un simple si/sinon conditionnel – jayphelps

+0

https://gist.github.com/jayphelps/7e708b59c17b4f327558e7e4501a0536 – jayphelps