使用Redux Saga对API调用进行重复数据删除

时间:2018-12-19 03:38:49

标签: redux redux-saga saga

在我的应用程序中,我需要将一个项目状态保存到服务器。 但是有时我会触发一个提交链,每个提交链彼此之间相距约10ms。

State A
State B 
State C 
State D 

在这种情况下,我实际上应该只提交状态D。

我当前的解决方案是在带有

的传奇中使用takeLatest()
function* submitItemStateSaga(action: Action<SubmitItemStatePayload>) {
    yield call(delay, THROTTLE_MS);
    //saga body
}

在我看来,这有点怪癖。您认为这样还好吗,还是有使用内置的crunch()函数更好的方法呢?

2 个答案:

答案 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()之类的原语实现的,这些实现在文档中提供。如果默认行为不适合您,则这些实现是编写自己的自定义解决方案的良好开端。