Для этого вы можете использовать redux-saga. Сага Redux специально используется для вызова асинхронных функций и обработки побочных эффектов.
Например, вы можете указать значок загрузчика в пользовательском интерфейсе, в то время как данные извлекаются. И затем скройте значок загрузчика после получения данных. Вы можете написать преобразование этой асинхронной активности в синхронную с использованием Redux-саги.
Пример saga-
import { take, call, put, fork, cancel, race } from 'redux-saga/effects';
import { delay } from 'redux-saga';
import { LOCATION_CHANGE } from 'react-router-redux';
import { DATA_LOAD_REQUEST } from './constants';
import { dataLoadSuccess, dataLoadFailure } from './actions';
import request from 'utils/request'; //isomorphic-fetch
export function* getCompanies() {
const requestURL = 'https://api.myjson.com/bins/32rap';
const { companies, timeout } = yield race({
companies: call(request, requestURL),
timeout: call(delay, 10000),
});
if (companies) {
yield put(dataLoadSuccess(companies.data));
} else if (timeout) {
yield put(dataLoadFailure());
} else {
yield put(dataLoadFailure());
}
}
export function* getCompaniesWatcher() {
while (yield take(DATA_LOAD_REQUEST)) {
yield call(getCompanies);
}
}
export function* companiesData() {
const watcher = yield fork(getCompaniesWatcher);
yield take(LOCATION_CHANGE);
yield cancel(watcher);
}
// All sagas to be loaded
export default [
companiesData,
];
Вы можете найти эту ошеломляют, в первую очередь. Позвольте мне объяснить это пополам. Если вы проигнорируете шаблонную схему redux-saga, вы увидите, что этот код «выглядит» абсолютно синхронно!
расшифровки данного код-
Отправки dataLoadRequest()
в Redux магазин. (Чтобы показать загрузчик в пользовательском интерфейсе).
Запросить данные для API.
- ручки тайм-аут (если данные не загружается в течение 10 секунд, отправка
dataLoadFailure()
действие на перевождь магазина.
- Если данные получены, отправка
dataLoadSuccess()
действие в магазин.
Перевождь-сага использует ES6 генератор функции. yield
ключевого слово является часть функции генератора. function*
означает, что она является функцией генератора, а не нормальная функция Javascript.
Надеется, что это помогает. Удаче!
Я не использовал среагировать или Redux, но я уверен, что у них есть какой-то способ использовать посылы. Пробовали ли вы использовать реализацию обетованной библиотеки или даже собственные обещания? – zero298
Что вы используете 'ajax' lib? – 1ven
@ 1ven axios one – Ilja