根 Saga 模式
根 Saga 将多个 Saga 聚合到一个单一的入口点,供 sagaMiddleware 运行。
在初级教程中,展示了你的根 saga 可能会像这样:
export default function* rootSaga() {
yield all([
helloSaga(),
watchIncrementAsync()
])
// all-effect 之后的代码
}
这是实现根的几种方式之一。这里,all
效果用于数组,你的 sagas 将并行执行。其他根实现可能会帮助你更好地处理错误和更复杂的数据流。
非阻塞 fork 效果
贡献者 @slorber 在 issue#760 中提到了其他几种常见的根实现。首先,有一种流行的实现方式,其行为类似于教程中的根 saga 行为:
export default function* rootSaga() {
yield fork(saga1)
yield fork(saga2)
yield fork(saga3)
// fork-effect 之后的代码
}
使用三个独特的 yield fork
将返回三次任务描述符。你的应用程序中的结果行为是所有的子 saga 都按照相同的顺序开始和执行。由于 fork
是非阻塞的,rootSaga
可以在子 saga 继续运行并被其内部效果阻塞的同时完成。
一个大的 all 效果和几个 fork 效果之间的区别是,all
效果是阻塞的,所以 all-effect 之后的代码(参见上述代码中的注释)在所有子 saga 完成时执行,而 fork
效果是非阻塞的,所以 fork-effect 之后的代码 在产生 fork 效果后立即执行。另一个区别是,当使用 fork 效果时,你可以得到任务描述符,所以在后续的代码中,你可以通过任务描述符取消/加入 forked 任务。