Как связать обещание в редуксе
Как мне сделать вызов API сначала в избыточном действии, а затем отправить GET_TODOs?
// 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))
};
Я получаю ошибку ниже
Ошибка: действия должны быть простыми объектами. Используйте пользовательское промежуточное ПО для асинхронных действий.
1 ответ
Используйте промежуточное программное обеспечение Thunk. Вот как будет выглядеть ваше действие:
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
})
})
}
}