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