Зачем вам рекурсия? Выглядит как набор костылей. Попробуйте решить задачу по-другому. Например, забрать данные одним запросом, либо реализовать бесконечный скролл с подгрузкой данных по требованию.
Перерисовка наступает тогда когда вы обновляете
store. Ничего удивительного.
Если так хотите оставить и использовать свой подход. У вас есть два пути:
1. Добавить в store ключ
isAllDataLoaded и обновлять его в редьюсере когда приходит последняя часть данных.
2. Добавить в проект
redux-thunk. Переписать свою функцию в
async action:
const fetchData = () => async dispatch => {
const data = [];
try {
while(true) {
const response = await Api.getSomeData({ from: data.length });
data.push(response.item); // если item это массив, то data.push(...response.item);
if(!response.items.length) {
break;
}
}
dispatch(fetchDataSuccess(data));
return data;
} catch (e) {
dispatch(fetchDataFail(e));
}
};
Еще учитесь писать поддерживаемый и читаемых код. Соблюдайте стандарты комьюнити, такие запросы, при использовании
redux, принято выносить в
async action или
сагу.
В
API принято реализовывать эндпоинты для получения как одного экземпляра данных, так и целой коллекции.
Возможно, вам стоит написать эндпоинт для получении всей коллекции данных. Потому что сейчас ваш код выглядит как набор костылей, написанных, в попытке заполнить именно эту брешь в
API.