javascript - 当使用 redux-saga 发送一个 Action 时取消一个 saga

标签 javascript redux redux-saga

我在调度 START 操作时为秒表 React 组件启动计时器:

import 'babel-polyfill'
import { call, put } from 'redux-saga/effects'
import { delay, takeEvery, takeLatest } from 'redux-saga'
import { tick, START, TICK, STOP } from './actions'

const ONE_SECOND = 1000

export function * timerTickWorkerSaga (getState) {
  yield call(delay, ONE_SECOND)
  yield put(tick())
}

export default function * timerTickSaga () {
  yield* takeEvery([START, TICK], timerTickWorkerSaga)
  yield* takeLatest(STOP, cancel(timerTickWorkerSaga))
}
/*
  The saga should start when either a START or a TICK is dispatched
  The saga should stop running when a stop is dispatched
*/

当从我的组件调度 STOP 操作时,我无法停止 saga。我尝试在我的 worker saga 中使用 cancelcancelled 效果:

if(yield(take(STOP)) {
  yield cancel(timerTickWorkerSaga)
}

以及第一个代码块中的方法,我尝试从观看服务中停止 saga。

最佳答案

Redux-Saga 现在有一个方法,叫做 race race。它将运行 2 个任务,但是当一个完成时,它会自动取消另一个。

  • https://redux-saga.js.org/docs/advanced/RacingEffects.html

  • watchStartTickBackgroundSaga 一直在运行

  • 每次开始或滴答时,都会在 timerTickWorkerSaga 和监听下一个 STOP 操作之间开始竞赛。
  • 当其中一个任务完成时,另一个任务被取消 这是种族的行为。
  • race 中的名称“task”和“cancel”无关紧要,它们只是有助于代码的可读性

export function* watchStartTickBackgroundSaga() {
  yield takeEvery([START, TICK], function* (...args) {
    yield race({
      task: call(timerTickWorkerSaga, ...args),
      cancel: take(STOP)
    })
  })
}

关于javascript - 当使用 redux-saga 发送一个 Action 时取消一个 saga,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37689562/

相关文章:

react-native - 无法捕获由redux-saga call()引发另一个错误的错误

reactjs - 动态加载 sagas 以在 Redux 应用程序中进行代码分割

javascript - 如何在表单输入中使用onload?

Javascript - 查找素数列表的代码一直卡住

javascript - electronics-react-boilerplate - 路线变化和状态

node.js - 在服务器和客户端上使用 Redux

reactjs - 了解combineReducers

redux-saga - 如何为 yield put() 创建 setTimeout 循环

javascript - Firebase 日期范围查询不起作用

Javascript 改变 Div 样式