2017-08-24 1 views
1

Ich benutze react-observable, um eine reaktionsnative Anwendung zu entwickeln.Verwenden Sie eine Ausgabe von Epic als eine andere Eingabe von Epic in reagieren beobachtbar

Ich habe zwei Epen, eine wird verwendet, um die Breite und Länge zu holen, und eine andere wird verwendet, um die Adresse durch die Breite und Länge zu bekommen.

Meine Frage ist, wie ich eine Sache in einem Epos machen möchte, wie könnte ich die Ausgabe des ersten Epos als die Eingabe des zweiten Epos verwenden?

const getLocationEpic = action$ => 
    action$.ofType('GET_LOCATION') 
     .mergeMap(() => 
      currentPosition$() 
       .map(data => ({ 
        type: 'GET_LOCATION_SUCCESS', 
        data: {"latitude": data.coords.latitude, "longitude": data.coords.longitude} 
       })) 
       .catch(error => { 
        console.log("GET POSITION ERR", error); 
        return Observable.of({type: 'GET_POSITION_ERROR', error: error}); 
       }) 
     ); 
const getAddressEpic = action$ => 
    action$.ofType('GET_ADDRESS') 
     .switchMap(action => 
      ajax(`https://maps.googleapis.com/maps/api/geocode/json?latlng=${latitude},${longitude}`) 
       .map(data => (data)) 
       .do({ 
        next: data => { 
         console.log("address data"); 
         console.log(data); 
        } 
       }) 
       .map(data => ({ 
        type: 'GET_POSITION_SUCCESS', data: data.response.results[0].formatted_address 
       })) 
       .mergeMap(() => 
        currentPosition$() 
         .map(data => ({ 
          type: 'GET_ADDRESS_SUCCESS', 
          data: {"latitude": data.coords.latitude, "longitude": data.coords.longitude} 
         })) 
         .catch(error => { 
          console.log("GET_ADDRESS_ERROR", error); 
          return Observable.of({type: 'GET_ADDRESS_ERROR', error: error}); 
         }) 
       )); 

Antwort

0

könnte es so etwas wie dieses:

getLocationEpic(action) 
    .mergeMap((action) => getAddressEpic(action)) 
    .subscribe((data) => { 
     /* get the result from epic 1 to epic 2 */ 
    }) 

Detail: Nehmen Ergebnis getLocationEpic, dann abzuflachen und das Ergebnis in getAddressEpic ernähren. Abonnieren Sie es für das Endergebnis.

0

In Redux-Observable erhalten deine Epen einen Stream aller Aktionen - was nicht offensichtlich ist, schließt Aktionen ein, die von anderen Epen ausgelöst werden. Dies ist eine sehr mächtige Funktion, da Sie Epen schreiben können, die nicht mit Implementierungsdetails in den anderen Epen gekoppelt werden müssen. Die Aktion ist der Vertrag.

In Ihrem Fall haben Sie gesagt, dass Sie sie als 1. sequenzieren möchten, erhalten Sie Längengrad/Breitengrad 2. Verwenden Sie dann long/lat, um ihre Adresse zu erhalten.

Ihr getAddressEpic muss dann nur auf GET_LOCATION_SUCCESS hören, um benachrichtigt zu werden und die long/lat Werte zu erhalten.

const getAddressEpic = action$ => 
    action$.ofType('GET_LOCATION_SUCCESS') // <--- listen for location success action 
     .switchMap(action => 
      // you can now use the long/lat from that action 
      ajax(`${apiURL}/geocode/json?latlng=${action.data.latitude},${action.data.longitude}`) 
+0

Hey dort. Hat das deine Frage beantwortet? – jayphelps

Verwandte Themen