やりたいことは表題の通りなのですが、reduxsagaで3秒ごとにreducerにactionを渡して、stopの処理をかけたらその処理を止めたいです。
現状コードは下記のような感じです。エンティティはtaskというものになります。
もちろん下記では動きません。3秒ごとにreducerへactionを渡すことはできていますが、それを止める方法がわからないでいます。
javascript
1function* changeTask(action) { 2 try { 3 const task = action.payload 4 yield call(controlTime, task) 5 toastr.success('update success!') 6 } catch(e) { 7 toastr.error(`${e}`) 8 } 9} 10 11function* controlTime(task) { 12 if (task.status === WORKING) { 13 while(true) { 14 yield put({ type: 'UPDATE_TASK', task }) 15 yield delay(3000) 16 } 17 } else { 18 return 19 } 20} 21 22function* watchChangeTask() { 23 yield takeEvery('REQUEST_CHANGE_TASK', changeTask) 24} 25
そもそもsetIntervalを使えば良いのでは?というふうに思うのですが、setIntervalのなかで
reduxsagaで
javascript
1let timer = null; 2const start = () => { 3 timer = setInterval(() => yield put({ type: 'UPDATE_TASK', task })), 3000); 4}
を実行できなかったので、sagaのdelayを使って実装したい感じです。実行できないというのはどのような判断かというと、reducer側にconsole.logを書いたのですが、3秒ごとでも実行されなかったのでそのような判断をしました。
javascript
1export const taskReducer = handleActions( 2 { 3 UPDATE_TASK: (state = initialState, action) => { 4 console.log('uuuuuu') 5 const newTask = action.task 6 return { ...state, tasks: [...state.tasks.map((task) => task.id === newTask.id ? { ...task, status: newTask.status } : task)] }; 7 } 8 }, 9 initialState 10);
質問事項としては、
- setintervalを使わず処理をstopできるやり方をご存知でしたらお伺いしたいです。
- もしそもそもsetintervalでreducerにaction渡せる場合はそのやり方をお伺いできればと思います。
何卒よろしくお願いします。
あなたの回答
tips
プレビュー