在我的应用程序中,我需要将一个项目状态保存到服务器。 但是有时我会触发一个提交链,每个提交链彼此之间相距约10ms。
State A
State B
State C
State D
在这种情况下,我实际上应该只提交状态D。
我当前的解决方案是在带有
的传奇中使用takeLatest()function* submitItemStateSaga(action: Action<SubmitItemStatePayload>) {
yield call(delay, THROTTLE_MS);
//saga body
}
在我看来,这有点怪癖。您认为这样还好吗,还是有使用内置的crunch()函数更好的方法呢?
答案 0 :(得分:0)
这10毫秒是由您还是由服务器的响应确定的?如果是后者,则这种方法迟早会令您失望。
话虽如此,你可以做到
function* submitItemStateSaga(action) {
const { submit, cancel } = yield race({
submit: take('CONFIRM_SUBMISSION'),
cancel: take('CANCEL_SUBMISSION'),
})
if (submit) {
//saga body
}
}
function* actionWatcher() {
yield takeLatest('START_SUBMISSION', submitItemStateSaga)
}
在链上每个提交的开始,您可以调度该操作以取消上一个并开始下一个。然后,在执行了整个链之后,您将分派操作以确认提交。
答案 1 :(得分:0)
看起来redux-saga的debounce()
更适合您的用例。它等待传入的动作变慢,然后执行带有最后一个动作的任务。
throttle()
和debounce()
都是通过fork()
和call()
之类的原语实现的,这些实现在文档中提供。如果默认行为不适合您,则这些实现是编写自己的自定义解决方案的良好开端。