2016-06-30 10 views
2

내 앱의 데이터 소스는 XML 형식의 데이터 만 제공합니다.XML을 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