2017-07-19 1 views
4

J'ai rencontré ce problème plusieurs fois où je veux accéder à action.payload plus bas dans la chaîne. Mais d'ici là, l'argument passé à mergeMap a déjà changé en quelque chose d'autre.Redux Observable: Comment utiliser action.payload dans la dernière partie de la chaîne?

Compte tenu de mon action ressemble à ceci:

{ 
    type: BUY_GEMS, 
    payload: { value: 123, productIdentifier: "ABC123" } 
} 

Et cette épopée:

function purchaseGems(action$, store) { 
    return action$ 
    .ofType(BUY_GEMS) 
    .mergeMap(action => { 
     const { productIdentifier } = action.payload; // <-------- works because it's the first mergeMap in this sequence 
     return Observable.fromPromise(
     // Some promise call 
    ).catch(error => Observable.of(buyGemsRejected(error))); 
    }) 
    .mergeMap(action => { 
     const { value } = action.payload; // <----------- doesn't work because "action" is now just the response of the Promise above. 
     ... 
    }); 
} 

Comment puis-je faire cela?

Répondre

5

Cette astuce consiste simplement à placer votre deuxième mergeMap à l'intérieur de la fermeture où l'action est disponible. En fait, même si vous n'aviez pas besoin d'y accéder, je recommande généralement ce modèle dans redux-observable en isolant vos chaînes Observable dans votre seul opérateur de stratégie de fusion de niveau supérieur (mergeMap, switchMap, etc.) car il fait de futurs refactoring comme cette isolation d'erreur plus facile et plus facile (si elle est ajoutée).

function purchaseGems(action$, store) { 
    return action$ 
    .ofType(BUY_GEMS) 
    .mergeMap(action => { 
     const { productIdentifier } = action.payload; 
     return Observable.fromPromise(somePromise) 
     .catch(error => Observable.of(buyGemsRejected(error))) 
     .mergeMap(response => { 
      const { value } = action.payload; 
      // ... 
     }); 
    }); 
} 

Votre exemple contenu Observable.fromPromise() que je suppose est juste pseudo code, donc je suivi avec Observable.fromPromise(somePromise) pour plus de clarté pour les autres lecteurs.

+1

vous le meilleur !!!! – Edmund