Я хочу дождаться завершения всех действий put в моем yieldall, прежде чем переходить к следующему yield. Я думал, что это то, чего должен достичь yieldall. Я новичок в Redux Saga, поэтому могут быть некоторые детали или логика, которые я упускаю.

Вот мой workerAnalytics (первый воркер, вызванный с помощью отправки 'ANALYTICS')

export function* workerAnalytics(action) {
    console.log('here')
    let group = action.group
    yield put({ type: 'SHOW_LOADER', loading: action.loading })
    yield all([
        put({ type: 'BASIC_ANALYTICS', loading: 'client', group: group }),
        put({ type: 'BASIC_ANALYTICS', loading: 'KPI', group: group }),
        put({ type: 'BASIC_ANALYTICS', loading: 'country', group: group }),
        put({ type: 'BASIC_ANALYTICS', loading: 'estimated_revenue' }),
    ])
    console.log('there')
    yield put({ type: 'HIDE_LOADER', loading: action.loading })
}

Мой workerBasicAnalytics (вызывается после того, как watcherBasicAnalytics вызывается из типа отправки 'BASIC_ANALYTICS')

export function* workerBasicAnalytics(action) {
    try {
        let data;
        if (action.loading === 'KPI') { yield put({ type: 'SHOW_LOADER', loading: action.loading }) }
        data = action.loading === 'client' ? yield call(() => axiosInstance.get(`/customer-conversion/?group=${action.group}`)) :
            action.loading === 'KPI' ? yield call(() => axiosInstance.get(`/kpi/?group=${action.group}`)) :
                action.loading === 'country' ? yield call(() => axiosInstance.get(`/customer-country/?group=${action.group}`)) :
                    action.loading === 'estimated_revenue' ? yield call(() => axiosInstance.get('/estimated-revenue/')) : null
        yield put({ type: "STORE_DATA", payload: data.data, fetch: action.loading })
        if (action.loading === 'KPI') { yield put({ type: 'HIDE_LOADER', loading: action.loading }) }
        console.log(action.loading)

    } catch (error) {
        console.log(error)
    }
}

Как видите, у меня есть console.log во всех моих рабочих функциях, чтобы отслеживать, какие из них выполняются в первую очередь. Проблема в том, что «там» регистрируется сразу после «здесь», тогда как это должен был быть отдельный workerBasicAnalytics console.log (action.loading), который должен был регистрироваться до того, как будет записано «там», как console.log ( 'there') следует после yieldall.

Вся помощь приветствуется, спасибо всем!

0
jason 15 Июн 2020 в 07:26

1 ответ

Лучший ответ

Вы проверяли, вызывается ли вообще workerBasicAnalytics? Или если вы поймали ошибку в обработчике catch?

Обновление: Ты можешь сделать это:

yield all([
  workerBasicAnalytics({loading: 'client', group: group}), 
  workerBasicAnalytics({loading: 'KPI', group: group}
)]
1
Rox 15 Июн 2020 в 05:32