我如何等待所有 '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
效果已经接受效果。因此,您的代码中的问题是 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)
应该可以
您的操作不会 return 生成器函数。该操作被简单地分派到其他中间件的 redux 流中,reducer 以及最终 take
它们的任何 sagas。 put
中的 return 值只是操作。
所以,一旦动作被分派,all
块就完成了——不管获得 take
en 的任何动作是否已经完成任何事情。
如果你想 运行 并行的一堆其他 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)
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
效果已经接受效果。因此,您的代码中的问题是 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)
应该可以
您的操作不会 return 生成器函数。该操作被简单地分派到其他中间件的 redux 流中,reducer 以及最终 take
它们的任何 sagas。 put
中的 return 值只是操作。
所以,一旦动作被分派,all
块就完成了——不管获得 take
en 的任何动作是否已经完成任何事情。
如果你想 运行 并行的一堆其他 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)