Redux saga debounce 而不仅仅是延迟/取消

新手上路,请多包涵

有没有一种方法可以在 Redux-Saga 中去抖动,其中后续调用在相同的延迟之后排队,这会不断被添加到队列中的每个新任务所影响。类似于 lodash 的 debounce https://lodash.com/docs#debounce

我目前有类似于 redux-saga 的 debounce 的东西,但删除了取消部分,因为我仍然想执行每个任务,我只想捆绑所有事件以便稍后在单个线程中触发。

我目前拥有的:

 const deferTime = 2000;
const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));

export function* sendClickEvent (event, debounce) {
  if (debounce) {
    yield call(delay, deferTime);
  }
  yield put(action(event));
}

export function* clickSaga () {
  while (true) {
    const action = yield take(WIDGET_CLICKED);
    const state = yield select();
    const debounce = action.meta && action.meta.debounce;
    const payload = getWidgetClickPayload(state, action);
    const defaultData = getDefaultData(state);
    const event = {
      name: payload.name,
      data: Object.assign(defaultData, payload.data)
    };
    yield fork(sendClickEvent, event, debounce);
  }
}

我尝试将 fork 分配给变量,然后检查它是否正在运行 (.isRunning()) 但不知道如何通过另一个延迟来推迟该 fork。

原文由 Labithiotis 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 564
1 个回答

Redux saga 现在有一个 debounce 功能/效果:

 import { call, put, debounce } from `redux-saga/effects`

function* fetchAutocomplete(action) {
  const autocompleteProposals = yield call(Api.fetchAutocomplete, action.text)
  yield put({type: 'FETCHED_AUTOCOMPLETE_PROPOSALS', proposals: autocompleteProposals})
}

function* debounceAutocomplete() {
  yield debounce(1000, 'FETCH_AUTOCOMPLETE', fetchAutocomplete)
}

原文由 Dominic 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题