Blog>
Snippets

Implementing Debounce Logic with Redux-Saga

Provide an example of how to implement debouncing for an action in Redux-Saga using custom middleware, to prevent frequent dispatches of an action within a short timeframe.
import { put, call, delay } from 'redux-saga/effects';
import { debounce } from 'redux-saga/effects';

function* fetchData(action) {
  // Simulating a fetch call
  yield call(delay, 500); // Simulate a delay
  yield put({ type: 'DATA_FETCHED', payload: action.payload }); // Dispatch DATA_FETCHED action with the payload
}

export function* watchFetchData() {
  // Debounce action calls by 500ms. Only proceed with the latest call after 500ms of silence.
  yield debounce(500, 'FETCH_REQUESTED', fetchData);
}
This code snippet demonstrates how to implement debouncing in Redux-Saga with the `debounce` effect. It's used to prevent calling the `fetchData` saga too frequently. The `watchFetchData` saga listens for `FETCH_REQUESTED` actions and debounces these calls, meaning if another `FETCH_REQUESTED` action is dispatched within 500ms, only the latest action will actually trigger the `fetchData` saga. This reduces unnecessary API calls or computations if the action is dispatched in rapid succession.