2016-06-30 8 views
2

私のアプリのデータソースは、XML形式のデータのみを提供します。

XMLデータを取得するためにAxiosを使用します。これは、結果のデータセクションの文字列として終了します。

xml2jsを使用して変換しようとしましたが、非同期ジョブが返されてリターンするため、redux-promise middelwareを動作させることはできません。レデューサーがデータをレンダリングすべきコンポーネントに送ると、ペイロードは何もありません。

これが意味をなさないのかどうかわかりませんが、コンポーネントでデータを送信する前に、リダンダントが新しい関数呼び出しを返すのを待ちますか?

アクション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 
    } 
} 

私の減速

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

知っているあなたはまた、あなたがプロセスをフェッチについて知っておく必要があり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; } 

を使用することができ、非同期アクションのため 変換されていないXML文字列を返すので正しくないが、何を返すべきか?または、parseString関数が返されるまで減速機が戻らないようにすることはできますか? – Endre

+2

還元剤は解析してはいけません。減速機は新しい状態を作るために行動と古い状態を取る。その仕事は何かを取ったり、変換したりすることではありません。レデューサーを一時停止することができたら、完了するまでブラウザーページ全体をロックしたいでしょうか?すべてのデータを準備してから、アプリ状態にするための操作をディスパッチするまで待ちます。これには、データの非同期解析が含まれます。 – DDS

+0

非同期アクションにRedux-Thunkを使用します。またはRedux-Sagaを使用してください(学習曲線の準備が必要です)。 – DDS

答えて

3

axiosが非同期であるため、あなたが、あなたの行動のクリエータコードを変更する必要があります。受信データの後にアクションをディスパッチします。 このロジックはレデューサーでは必要ありません。ロード、成功、failure.Thenアクションの作成者は次のようになります可能性があります:私は、減速機のコードがある

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

ありがとうございました。これは私の道でもっと先を助けました:)すばらしい説明。 – Endre

+0

)あなたはこの[チャット](https://discordapp.com/channels/102860784329052160/103538784460615680)の質問をオンラインでお願いできます。 –

+0

鉱山はまったく同じ問題です。私は苦労しています。ありがとう。 – kobe

関連する問題