我如何等待所有 'put' 操作并行完成 运行?

How can I wait all 'put' actions finished in running parallel?

 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) {

    }
}

来自文档 all 效果已经接受效果。因此,您的代码中的问题是 yieldput 之前。

 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)

应该可以

您的操作不会 return 生成器函数。该操作被简单地分派到其他中间件的 redux 流中,reducer 以及最终 take 它们的任何 sagas。 put 中的 return 值只是操作。

所以,一旦动作被分派,all 块就完成了——不管获得 takeen 的任何动作是否已经完成任何事情。

如果你想 运行 并行的一堆其他 sagas 并阻塞直到它们全部完成,你可以只调用其他的 sagas,然后使用 all 并行调用它们, 根据 the docs:

Yielding to an array of nested generators will start all the sub-generators in parallel, wait for them to finish, then resume with all the results

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)