我试图做出一个“简单”的传奇,在此我进行'chain' of sagas
和CANCEL
动作。比赛进行顺利,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')
}
所以比赛结束后,我可以看到“终点”已注销,但没有看到“完成”。如果取消触发,我可以看到“已取消”已注销。 (因此,永远不会触发的唯一部分是“完成”)
答案 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)
])
}
所以不要调用它。我将其分叉,以免阻塞传奇。而是等待完成的动作。