如何等待并行运行中完成的所有“放置”操作?

时间:2018-11-29 04:02:19

标签: javascript redux redux-saga

 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 :(得分:1)

您的操作不会返回生成器函数。只需将操作分派到其他中间件,reducers以及最终take的所有sagas的redux流中。 put的返回值只是操作。

因此,一旦分派了动作,all块就完成了-不管获得take的任何动作是否已经完成。

如果您要并行运行一堆其他的sagas并阻塞直到它们全部完成,您可以调用其他的sagas,并按照{{3 }}:

  

产生一个嵌套的生成器数组将并行启动所有子生成器,等待它们完成,然后恢复所有结果

     

all

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

答案 1 :(得分:0)

从文档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)

应该工作