2016-06-30 15 views
2

Die Datenquelle für meine App bietet nur Daten im XML-Format.XML in react-redux-promise-App parsen

Ich benutze Axios, um die XML-Daten zu erhalten. Es endet als eine Zeichenfolge in dem Datenabschnitt des Ergebnisses.

Ich habe versucht, xml2js zu verwenden, um es zu konvertieren, aber es löst nur einen asynchronen Job und kehrt zurück, so dass ich nicht die Redux-Versprechen Middelware funktioniert. Die Nutzlast ist nichts, wenn die Reduzierer die Daten an die Komponente senden, die sie rendern soll.

Nicht sicher, ob dies sinnvoll ist, aber kann ich den Reducer warten, bis der neue Funktionsaufruf zurückkommt, bevor er die Daten an die Komponente sendet?

Aktion index.js

export function fetchData(jobid, dest) { 
    const url = `${DATA_URL}jobid=${jobid}&refdist=${dest}`; 
    const request = axios.get(url); 

    console.log(request); 

    return { 
     type: FETCH_DATA, 
     payload: request 
    } 
} 

mein Minderer

export default function (state = [], action) { 
    console.log(action); 

    switch (action.type) { 
     case FETCH_DATA: 
      console.log("pre"); 
      parseString(action.payload.data, function (err, result) { 
       // Do I need some magic here??? or somewhere else? 
       console.dir(result); 
      }); 

     return [action.payload.data, ...state]; 
    } 
    return state; 
} 
+0

weiß, dass ich das Reduktionscode ist nicht korrekt, da es die nicht konvertierte XML-Zeichenfolge zurückgibt, aber was soll ich zurückgeben? Oder kann ich den Reduzierer stoppen, bis die ParseString-Funktion zurückgegeben wurde? – Endre

+2

Der Reducer sollte nicht parsen. Der Reducer unternimmt eine Aktion und der alte Zustand einen neuen Zustand. Seine Aufgabe ist es nichts zu holen oder zu konvertieren. Wenn Sie Ihren Reducer pausieren könnten, würden Sie die gesamte Browserseite sperren wollen, bis es fertig ist? Warten Sie, bis alle Daten bereit sind, und senden Sie erst dann eine Aktion, um diese in den App-Status zu versetzen. Und das schließt Async-Parsing der Daten ein. – DDS

+0

Verwenden Sie Redux-Thunk für asynchrone Aktionen. Oder verwende Redux-Saga (sei auf eine Lernkurve vorbereitet). – DDS

Antwort

3

Sie Ihre Aktion Schöpfer Code ändern sollte, weil axios async ist. Und versenden Sie die Aktion nach den Empfangsdaten. Sie benötigen diese Logik nicht in Reducer. Für Asynchron-Aktionen können Sie redux-thunk

export const fetchData = (jobid, dest)=>dispatch =>{ 
    const url = `${DATA_URL}jobid=${jobid}&refdist=${dest}`; 

    const request = axios.get(url).then(res=>{ 
     parseString(res, function (err, result) { 
      if(result){ 
       dispatch({ 
        type: FETCH_DATA, 
        data:result 
       }) 
      } 
      if(err) throw err 
     }); 
    }).catch(err=>console.error(error)) 

}; 
///clean reducer 
export default function (state = [], action) { 
    switch (action.type) { 
     case FETCH_DATA: 
     return [...state, action.data ]; 
    } 
    return state; 
} 

Auch verwenden Sie möglicherweise über das Abrufen Prozess wissen: Laden, Erfolg, wie sieht failure.Then Aktion Schöpfer kann:

export const fetchData = (jobid, dest)=>dispatch =>{ 
const url = `${DATA_URL}jobid=${jobid}&refdist=${dest}`; 
    dispatch({ 
     type: FETCH_DATA_REQUEST, 
     data:result, 
     isFetching:true 
    }) 
    const request = axios.get(url).then(res=>{ 
     parseString(res, function (err, result) { 
      if(result){ 
       dispatch({ 
        type: FETCH_DATA_SUCCESS, 
        data:result, 
        isFetching:false 
       }) 
      } 
      if(err) throw err 
     }); 
    }).catch(err=>{ 
     dispatch({ 
      type: FETCH_DATA_FAILURE, 
      err:err, 
      isFetching:false 
     }) 
     console.error(error) 
    }) 

}; 
+0

Danke. Das hat mir auf meinem Weg weitergeholfen :) Tolle Erklärung. – Endre

+0

Sie sind willkommen) Sie können alle Fragen online auf diesem [Chat] (https://discordapp.com/channels/102860784329052160/103538784460615680) –

+0

meins ist genau das gleiche Problem, ich kämpfe, lassen Sie mich meinen Code auf diese Weise ändern. Vielen Dank. – kobe