Как я могу дождаться, когда все «положенные» действия закончатся параллельно? - PullRequest
0 голосов
/ 29 ноября 2018
 const data = yield all([
        // @TODO: Should be use action function.
        yield put({
            type: '@@app/PCPNAME/QUERY',
            payload: {},
        }),
        yield put({
            type: '@@app/PCPREGIONNAME/QUERY',
            payload: {},
        }),
        yield put({
            type: '@@app/PCPGROUPNAME/QUERY',
            payload: {},
        }),
        yield put({
            type: '@@app/SERVICETYPE/QUERY',
            payload: {},
        }),
        yield put({
            type: '@@app/PCPPRIMARYSPECIALTY/QUERY',
            payload: {},
        }),
    ])
console.log('DATA >>>', data)

Когда я запускаю эту функцию, «DATA >>>» запускается перед такими действиями, как: «@@ app / PCPPRIMARYSPECIALTY / QUERY», «@@ app / PCPNAME / QUERY» ....

Как мне дождаться завершения всех действий?


Обновлено

Пример действия: @@app/SERVICETYPE/QUERY

takeLatest('@@app/SERVICETYPE/QUERY', query)
...
function* query(action: any) {
    try {
        const resData = yield call(axios.get('/myserver'))
        yield put(saveDataInStorage(resData))
    } catch (err) {

    }
}

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Ваши действия не возвращают функции генератора.Действие просто отправляется в поток притока для другого промежуточного программного обеспечения, редукторов и, в конечном итоге, для любых саг, которые take их.Возвращаемое значение из put является просто действием.

Таким образом, как только отправлены действия, блок all завершается - независимо от того, имеет ли какое-либо действие, которое получает take en,завершить что-либо.

Если вы хотите запустить несколько других саг параллельно и заблокировать их, пока они не будут завершены, вы можете просто вызвать другие саги и использовать all для их параллельного вызова, какper the docs :

При уступке массива вложенных генераторов все параллельные генераторы будут запускаться параллельно, дождаться их завершения, а затем возобновить со всеми результатами

function* mainSaga(getState) { const results = yield all([call(task1), call(task2), ...]) yield put(showResults(results)) }

const data = yield all([
    yield call(PCPNAME_QUERY), // where PCPNAME_QUERY is a saga
    yield call(PCPREGIONNAME_QUERY),
    yield call(PCPGROUPNAME_QUERY),
    yield call(SERVICETYPE_QUERY),
    yield call(PCPPRIMARYSPECIALTY_QUERY),
])

console.log('DATA >>>', data)
0 голосов
/ 29 ноября 2018

Из документации all эффект уже принимает эффекты.Поэтому проблема в вашем коде - yield до put.

 const data = yield all([
    // @TODO: Should be use action function.
    put({
        type: '@@app/PCPNAME/QUERY',
        payload: {},
    }),
    put({
        type: '@@app/PCPREGIONNAME/QUERY',
        payload: {},
    }),
    put({
        type: '@@app/PCPGROUPNAME/QUERY',
        payload: {},
    }),
    put({
        type: '@@app/SERVICETYPE/QUERY',
        payload: {},
    }),
    put({
        type: '@@app/PCPPRIMARYSPECIALTY/QUERY',
        payload: {},
    }),
])
console.log('DATA >>>', data)

Должно работать

...