в моем приложении у меня есть следующий код
componentWillUpdate(nextProps) {
if(nextProps.posts.request.status === 'failed') {
let timer = null;
timer = setTimeout(() => {
if(this.props.posts.request.timeOut == 1) {
clearTimeout(timer);
this.props.fetchData({
page: this.props.posts.request.page
});
} else {
this.props.decreaseTimeOut();
}
}, 1000);
}
}
Что он делает, так это то, что, когда запрос API обнаружил ошибку, возможно, из-за отсутствия подключения к Интернету (например, как работает чат facebook) или произошла ошибка в серверной части, он повторит попытку через пять секунд, но setTimeout
требуется устанавливается каждую секунду для обновления части хранилища, то есть строки this.props.decreaseTimeOut();
, но если счетчик закончился, то есть прошло пять секунд, if block
запустится и повторно отправит fetchData action
.
Он работает хорошо, и у меня нет проблем с ним, по крайней мере, с точки зрения функциональности, но с точки зрения дизайна кода я знаю, что это side-effect
, и его не следует обрабатывать в моем реактивном компоненте, и поскольку я использую redux -saga (но я новичок в redux-saga, я только что узнал об этом сегодня), я хочу преобразовать эту функциональность в сагу, я еще не совсем понимаю, как это сделать, и вот мой fetchData saga
кстати.
import {
take,
call,
put
} from 'redux-saga/effects';
import axios from 'axios';
export default function* fetchData() {
while(true) {
try {
let action = yield take('FETCH_DATA_START');
let response = yield call(axios.get, '/posts/' + action.payload.page);
yield put({ type: 'FETCH_DATA_SUCCESS', items: [...response.data.items] });
} catch(err) {
yield put({ type: 'FETCH_DATA_FAILED', timeOut: 5 });
}
}
}