Для работы с promise Вам нужно использовать дополнительный middleware - promise middleware. Существует несколько реализаций - можете выбрать любой понравившийся. Я использую
этот и относительно него буду далее писать.
Как я понял, запрос пишется в action creator при помощи промиса
Да, все так. В экшен-креаторе делаем запрос, возвращаем экшен с промисом. Далее promiseMiddleware подхватывает его и вместо одного экшена диспатчит 3 - действие началось, действие завершилось успешно, действие завершилось с ошибкой. Все это происходит в зависимости от того в какое состояние попал вышеупомянутый promise. Другими словами - "действие началось" диспатчится сразу; если запрос успешен - диспатчится "действие завершилось успешно".
Соответственно в вашем редьюсере Вы подписываетесь на это три действия. Пример:
// action creator
import fetch from 'isomorphic-fetch';
export default function getBook() {
// Для запросов чаще всего используется isomorphic-fetch, который возвращает promise
const promise = fetch(url, options);
return {
types: [ 'GET_BOOK-BEGIN', 'GET_BOOK-SUCCESS', 'GET_BOOK-FAILURE' ],
promise,
};
}
// reducer
import {GET_BOOK} from '../actions/books';
const booksReducer = (state = {}, action) => {
switch (action.type) {
case 'GET_BOOK-SUCCESS':
// При успешном завершении у нас установлено свойство result с ответом сервера
return action.result;
case 'GET_BOOK-FAILURE':
// При неудачном завершении у нас установлено свойство error с описанием ошибки
doSomethingWithError(action.error); // <--- просто для примера
default:
return state;
}
};
export default booksReducer;
UPD1 К слову: у редакса есть отличный пример, где все это можно в живую посмотреть -
https://github.com/rackt/redux/tree/master/example...