如何在redux-sagas中设置并随后取消多个观察者

时间:2016-06-28 10:08:32

标签: reactjs redux redux-saga

只是试图绕过redux-sagas并遇到一个问题,在一个传奇中设置两个观察者然后取消它们。

一些背景知识:我有一个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的数组,但它们并未被取消。

1 个答案:

答案 0 :(得分:7)

您的代码无效,因为forEach返回undefined。您必须将其替换为map,这将返回一系列取消效果

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

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

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