我不清楚何时使用takeEvery以及何时使用takeLatest?在复古传奇里。
通过阅读官方文件,我得到了一个基本的区别。但是,在takeEvery中创建并发操作的用途是什么(例如,用户以快速的速度连续点击加载用户按钮2次,第二次单击将发出USER_REQUESTED,而对第一次单击的fetchUser尚未终止)
import { takeEvery } from `redux-saga/effects`
function* fetchUser(action) {
...
}
function* watchFetchUser() {
yield takeEvery('USER_REQUESTED', fetchUser)
}有谁能解释一下。因为我对复古传奇一无所知。
提前谢谢。
发布于 2020-05-24 11:10:28
这是每个用例都需要考虑的问题。
在这些情况下,您可以使用takeEvery。
takeLatest在这里也可以工作,但是当读取代码时,它可能会给出错误的指示,表明有什么东西需要取消。id。
在理想的实现中,您可能应该为同一个电影/id取消以前的load,但是这需要更复杂的代码,所以如果您只执行一些简单的应用程序,您可能会决定忽略它,只允许多次运行相同的电影。这就是我称之为“廉价实施”的原因。发布于 2020-10-28 17:36:30
虽然@Martin的可靠答案涵盖了这个问题,但我想更详细地阐述takeEvery和takeLatest上的细节和差异,以及何时可以使用它们,以便您可以得到它们的可能用例。
TLDR:
当需要返回所有以前的任务时,可以使用takeEvery。例如,从一个气象站获取某一段时间内的温湿度数据,将其存储在数据库中,并以图形的形式显示--在本例中,所有以前的sagas及其返回值都是interset和的值,而不仅仅是最新的。
如果一个内部/外部实例或一个接口的用户可以触发多个连续的操作,并且只有最后一个值的结论是可取的,则可以使用takeLatest。一个很好的例子是快速调用broker来实时显示股票价值,其中只有(最新/最近的价值是)感兴趣。
详细信息:
将takeEvery和takeLatest看作是redux底层API之上的辅助函数,当特定操作被分派到商店时,它们正在包装内部操作,例如生成任务。调用它们会在发送到与模式匹配的商店的每个动作上产生一个传奇。
takeEvery:
最常见的takeEvery函数在其行为和方法上非常类似于redux。它基本上是一个模式或通道的yield take和yield fork的包装器。
关于takeEvery的线索是,它允许并发/同时启动一个定义的操作/任务的多个实例(例如下面示例中的fetchSomeThing )。
与takeLatest不同,您可以在一个或多个以前的fetchSomeThing实例尚未完成/终止时启动一个新的fetchSomeThing任务,因此仍在挂起。请记住,不能保证任务将以相同的顺序结束/完成。要处理无序响应,可以使用takeLatest。
来自官方的文档
takeEvery(pattern, saga, ...args)
在发送到与模式匹配的商店的每个动作上产生一个传奇。
pattern:String / Array函数saga:函数-生成器函数args:要传递给已启动任务的数组参数。takeEvery将将传入的操作添加到参数列表中(即该操作将是提供给saga的最后一个参数)您还可以将通道作为参数传递,而不是传递与takeEvery(模式、佐贺、...args)相同的行为模式。
takeLatest:
相反,takeLatest助手函数只获得被触发的最新请求的响应,该响应可以看作是模式或通道的yield take的包装器,以及附加的if语句检查是否存在lastTask (之前的任务仍在等待中),然后通过yield cancel和随后的yield fork终止该yield cancel和后续yield fork,从而生成当前任务/操作。
来自官方的文档
takeLatest(pattern, saga, ...args)
只会触发最新请求的响应。
pattern:String / Array函数saga:函数-生成器函数args:要传递给已启动任务的数组参数。takeLatest将将传入的操作添加到参数列表中(即该操作将是提供给saga的最后一个参数)与takeEvery类似,您也可以将通道作为参数传递,而不是模式。
发布于 2021-10-28 18:58:14
用几句话来概括一下,
https://stackoverflow.com/questions/61984294
复制相似问题