Redux Saga отменяет предыдущий при получении последовательного запроса - PullRequest
1 голос
/ 02 мая 2020

В саге я создаю генератор, который я вызываю последовательно. когда второй вызов сделан и первый вызов находится в полете, то первое действие отменяется, и я получаю только данные из второго запроса, вот мой код. Начальное состояние в редукторе

export const initialState = {
sectionData:
{
    featuredData: false,
    popularData: false,
}}

featuredData и PopularData обновляются согласно результат вызова API в саге

это мой саг-код

function* getSectionData(){ yield takeLatest(LOAD_SECTION_DATA, fetchSectionData) }

function* fetchSectionData(action){
try
{
    var requestURL = `http://localhost:3001/v1/fetchData?page=` + action.section_name;
    console.log('Request Url', requestURL)
    const response = yield call(getRequest, requestURL);
    var result = {}
    if (action.section_name)
    {
        let sectionName = [action.section_name] + 'Data'
        result[sectionName] = response.data
    }
    console.log('Request result', result)
    yield put(sectionDataLoaded(result));
}
catch (err)
{
    yield put(sectionDataLoadingError(err));
}}

export default function* HomePageSaga(){ yield all([getSectionData()]); }

я вызываю fetchSectionData ('Featured') *

sectionData{
featuredData: false,
popularData: [{
    name: 'popular'
}]}

вместо

sectionData{
featuredData: [
{
    name: 'featured'
}],
popularData: [
{
    name: 'popular'
}]}

Ответы [ 2 ]

0 голосов
/ 02 мая 2020

Вы используете takeLatest

В вашем случае обязательно используйте takeEvery

Также прочитать

0 голосов
/ 02 мая 2020

Именно так должен работать takeLatest. Если запрос был запущен, а затем сделан другой, первый запрос отменяется. Я думаю, что вы хотите использовать takeEvery вместо этого. См. https://redux-saga.js.org/docs/api/ для функциональности takeEvery.

...