Javascript 重演传奇';s比赛获胜';t触发器

Javascript 重演传奇';s比赛获胜';t触发器,javascript,reactjs,asynchronous,redux,redux-saga,Javascript,Reactjs,Asynchronous,Redux,Redux Saga,我试着做一个“简单”的传奇故事,在那里我比赛一系列的传奇故事和一个取消的动作。比赛进行得很顺利,任务正在“获胜”,但比赛将返回一个空对象(因此我的if(task)不会被调用,即使比赛进行得很顺利) 工作原理: 任务: 我调用allActivity函数。 allActivity使用对象数组调用uploadData函数。 之后,我基本上只是上传每个项目与鼠尾草一个接一个 代码: 因此,在比赛结束后,我可以看到“结束”注销,但不能看到“完成”。如果取消被触发,我可以看到“取消”注销。(因此,唯一从未触

我试着做一个“简单”的传奇故事,在那里我比赛一系列的传奇故事和一个取消的动作。比赛进行得很顺利,
任务
正在“获胜”,但比赛将返回一个
空对象
(因此我的
if(task)
不会被调用,即使比赛进行得很顺利)

工作原理: 任务: 我调用
allActivity
函数。 allActivity使用对象数组调用
uploadData
函数。 之后,我基本上只是上传每个项目与鼠尾草一个接一个

代码:


因此,在比赛结束后,我可以看到“结束”注销,但不能看到“完成”。如果取消被触发,我可以看到“取消”注销。(因此,唯一从未触发的部分是“完成”)

我能够用一种非常简单的方法解决这个问题

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)
    ])
}

所以不要叫它。我会用叉子叉它,这样它就不会阻碍故事的发展。而不是等待完成的操作。

调用
不返回任务,而是返回函数/生成器的返回值。
allActivity
的返回值未定义,因此
task
变量也被解析为未定义。哦,这很有意义。
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)
    ])
}