如何在 redux-sagas 中设置并随后取消多个观察者
How to set up and subsequently cancel multiple watchers in redux-sagas
只是想了解 redux-sagas 和 运行 遇到在传奇中设置两个观察者然后随后取消它们的问题。
一些背景:我有一个 JSON 编辑器组件,其中传奇处理对后端 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 的数组,但它们并没有被取消。
您的代码无法运行,因为 forEach
return 未定义。您必须将其替换为 map
,这将 return 一系列取消效果
yield watcher.map(task => cancel(task))
您还可以使用race
效果以声明方式取消整个数组效果。请注意 fork
已替换为 call
export function* editorData() {
yield race([
[
call(loadSchemaWatcher),
call(saveSchemaWatcher)
],
take(LOCATION_CHANGE)
])
}
只是想了解 redux-sagas 和 运行 遇到在传奇中设置两个观察者然后随后取消它们的问题。
一些背景:我有一个 JSON 编辑器组件,其中传奇处理对后端 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 的数组,但它们并没有被取消。
您的代码无法运行,因为 forEach
return 未定义。您必须将其替换为 map
,这将 return 一系列取消效果
yield watcher.map(task => cancel(task))
您还可以使用race
效果以声明方式取消整个数组效果。请注意 fork
已替换为 call
export function* editorData() {
yield race([
[
call(loadSchemaWatcher),
call(saveSchemaWatcher)
],
take(LOCATION_CHANGE)
])
}