【问题标题】:How to set up and subsequently cancel multiple watchers in redux-sagas如何在 redux-sagas 中设置并随后取消多个观察者
【发布时间】:2016-06-28 10:08:32
【问题描述】:

只是想了解 redux-sagas 并遇到一个问题,在一个 saga 中设置两个观察者,然后取消它们。

一些背景知识:我有一个 JSON 编辑器组件,其中 saga 处理对后端 API 的调用以加载和保存 JSON 模式。该项目基于React Boilerplate,因此应用程序的结构几乎完全相同。

以下是相关代码:

export function* loadSchemaWatcher() {
  const action = yield take(LOAD_SCHEMA)
  yield call(loadSchema, action)
}

export function* saveSchemaWatcher() {
  while (true) {
    const action = yield take(SAVE_SCHEMA)
    yield call(saveSchema, action)
  }
}

export function* editorData() {
  const watcher = yield [
    fork(loadSchemaWatcher),
    fork(saveSchemaWatcher)
  ]

  yield take(LOCATION_CHANGE)
  yield watcher.forEach(task => cancel(task))
}

export default [
  editorData,
]

我假设yield watcher.forEach(task => cancel(task)) 只会循环Tasks 的数组,但它们并没有被取消。

【问题讨论】:

  • 有什么理由不简单地运行yield take(LOCATION_CHANGE) 然后在editorData() 之后立即运行两个分叉?

标签: reactjs redux redux-saga


【解决方案1】:

您的代码不起作用,因为forEach 返回未定义。你必须用map 替换它,这将返回一个取消效果数组

yield watcher.map(task => cancel(task))

您还可以使用race 效果以声明方式取消整个数组效果。请注意,fork 已替换为 call

export function* editorData() {
  yield race([
    [
      call(loadSchemaWatcher),
      call(saveSchemaWatcher)
    ],
    take(LOCATION_CHANGE)
  ])
}

【讨论】:

  • 为什么 eslint 不喜欢这样?错误:种族必须以对象哈希作为唯一参数 redux-saga/no-yield-in-race
猜你喜欢
  • 2017-01-23
  • 2017-04-02
  • 1970-01-01
  • 1970-01-01
  • 2018-06-11
  • 2017-02-01
  • 2021-04-13
  • 1970-01-01
  • 2017-08-30
相关资源
最近更新 更多