Redux Saga的比赛不会触发

时间:2018-07-17 18:40:51

标签: javascript reactjs asynchronous redux redux-saga

我试图做出一个“简单”的传奇,在此我进行'chain' of sagasCANCEL动作。比赛进行顺利,task获胜,但是比赛将返回empty object(即使比赛失败,我的if(task)也不会被召唤正确)。

它是如何工作的: 任务: 我调用allActivity函数。 allActivity使用对象数组调用uploadData函数。 在那之后,我基本上只是将每个项目与圣人一一上传。

代码:

function* handleSingle(item) {
    const respone = yield call(myFetch, item)
    return response
}

function* uploadData(data) {
    yield all(data.map(item=>handleSingle(item)))
}

function* allActivity() {
    const data = yield select(state=>state.data)
    yield call(uploadData, data)
}

function* uploadJobWorker() {
    const { task, cancel } =  yield race({
        task: call(allAcivity),
        cancel: take(ON_CANCEL)
    })

    if(task)
        console.warn('done')
    if(cancel)
        console.warn('cancelled')

    console.warn('end')
}

所以比赛结束后,我可以看到“终点”已注销,但没有看到“完成”。如果取消触发,我可以看到“已取消”已注销。 (因此,永远不会触发的唯一部分是“完成”)

1 个答案:

答案 0 :(得分:0)

我能够通过一种非常简单的方法来解决这个问题。

const delay = (ms) => new Promise(res => setTimeout(res, ms))

function* handleSingle(number) {
    const response = yield call(delay, 1000)
    console.warn(`${number} is finished`)
    return response
}

const mock = [1,2,3,4,5,6,7,8,9,10]

function* uploadData() {
    for(const number of mock) {
        yield call(handleSingle, number)
    }
    yield put({ type: FINISHED })
}

function* allActivity() {
    yield call(uploadData)
}

function* uploadJobWorker() {
    yield fork(allActivity)
    const { task, cancel, error } =  yield race({
        task: take(FINISHED),
        cancel: take(CANCEL),
        error: take(ERROR),
    })

    if(task)
        console.warn('done')
    if(cancel)
        console.warn('cancel')
    if(error)
        console.warn('error')

    console.warn('end')
}

export default function* rootSaga() {
    yield all([
        takeEvery(EXAMPLE, uploadJobWorker)
    ])
}

所以不要调用它。我将其分叉,以免阻塞传奇。而是等待完成的动作。