2016-09-30 10 views
1

還元アクションでAPIコールをまず呼び出してから、GET_TODOをディスパッチするにはどうすればよいですか?返済アクションで約束を結ぶ方法

// first the api call has to be made, 

    export function getTodos() { 
    return { 
      type: 'GET_TODOS', 
      promise: request.get(API_URL) 
     } 
    } 

それが応答に

// using https://github.com/Leonidas-from-XIV/node-xml2js 
parseString(res, function (err, result) { 
      // data gets parsed here 
}); 

を解析する必要がそれからそれは昇給にイベントを送信する必要があります。私は以下のようにしようとしたが、私が

エラー以下のエラー取得していますエラー

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

を投げている:アクションは、プレーンオブジェクトでなければなりませんが。非同期アクションにはカスタムミドルウェアを使用します。

答えて

4

thunk middlewareを使用してください。ここにあなたの行動は次のようになり方法は次のとおりです。

export const GET_TODOS = 'GET_TODOS' 
export const GET_TODOS_SUCCESS = 'GET_TODOS_SUCCESS' 
export const GET_TODOS_FAILURE = 'GET_TODOS_FAILURE' 

export function getTodos() { 
    return dispatch => { 
    dispatch({ 
     type: GET_TODOS 
    }) 

    fetch(url) // or whatever way you're making API call 
     .then(res => { 
      parseString(res, (err, result) => { 
       if (err) { 
       throw err 
       } 

       dispatch({ 
       type: GET_TODOS_SUCCESS, 
       payload: result 
       }) 
      }) 
     }) 
     .catch(err => { 
       dispatch({ 
       type: GET_TODOS_FAILURE, 
       payload: err 
       }) 
     }) 
    } 
} 
+0

は非常にきれいに見える私はサンクと約束ミドルウェアを交換し、それが自動的に動作している場合、私は次のReduxのboilerplatを使用しています、あなたは思いますか? https://github.com/bananaoomarang/isomorphic-redux – kobe

+0

isomorpchcのクライアント側とサーバー側の両方で動作するようにAxiosを使用しています – kobe

+1

@kobeこれを行うことはできますが、サンクミドルウェアには必要と思わない約束ミドルウェアを削除する。これを参照してくださいhttp://stackoverflow.com/a/36578210/162461 – craftsman