虽然@Martin Kadlec 的可靠答案涵盖了这个问题,但我想详细说明 takeEvery 和 takeLatest 的细节和差异以及何时可以使用它们您可以推导出它们的可能用例。
TLDR:
当需要所有先前任务的返回时,您可以使用 takeEvery。例如,从气象站获取一段时间内的温度和湿度数据,将其存储在数据库中并显示为图表 - 在这种情况下,所有以前的 saga 及其返回值都是相互交叉的,不仅仅是最新的强>。
如果 i.E. 你可以使用 takeLatest内部/外部实例或界面的用户可能会触发多个连续动作,并且只有最后一个值的结论是可取的。一个很好的例子是快速调用经纪人 API 以获取股票价值的实时报价,其中只有最新/最近的价值是感兴趣的。
详细:
将 takeEvery 和 takeLatest 视为 redux-saga 底层 API 之上的辅助函数,它们封装了内部操作,例如在调度特定操作时生成任务到商店。调用它们会在调度到与模式匹配的 Store 的每个操作上产生一个 saga。
takeEvery:
最常见的 takeEvery 函数在其行为和方法上与 redux-thunk 非常相似。它基本上是模式或通道的yield take 和yield fork 的包装器。
关于 takeEvery 的线索是它允许同时/同时启动已定义操作/任务的多个实例(例如下面示例中的 fetchSomeThing)。
与 takeLatest 不同,您可以在 fetchSomeThing 的一个或多个先前实例尚未完成/终止时开始新的 fetchSomeThing 任务,因此仍处于挂起状态。请记住,不能保证任务将以与启动相同的顺序终止/完成。要处理乱序响应,您可以使用 takeLatest。
来自官方docs:
takeEvery(pattern, saga, ...args)
在发送到 Store 且匹配模式的每个操作上生成一个 saga。
-
pattern: 字符串 |数组 |功能
-
saga:函数 - 生成器函数
-
args: 数组 - 要传递给已启动任务的参数。 takeEvery 会将传入的动作添加到参数列表中(即动作将是提供给 saga 的最后一个参数)
您还可以将通道作为参数而不是模式传递,从而产生与 takeEvery(pattern, saga, ...args) 相同的行为。
takeLatest:
相比之下,takeLatest 辅助函数只获取被触发的 latest 请求 的响应,并且可以看作是 的 yield take 的包装器模式或通道 和一个额外的 if 语句检查是否存在 lastTask(之前的任务仍处于挂起状态),然后将通过 yield cancel 和后续的 @ 终止987654334@ 将产生当前任务/动作。
来自官方docs:
takeLatest(pattern, saga, ...args)
只会得到最近触发的请求的响应。
-
pattern: 字符串 |数组 |功能
-
saga:函数 - 生成器函数
-
args: 数组 - 要传递给已启动任务的参数。 takeLatest 会将传入的动作添加到参数列表中(即动作将是提供给 saga 的最后一个参数)
与 takeEvery 类似,您也可以将通道作为参数而不是模式传递。