Вызов асинхронной функции в setTimeout

#reactjs #react-redux #redux-thunk

#reactjs #реагирование-сокращение #redux-thunk

Вопрос:

Я пытаюсь использовать ползунок d3 с реакцией so, чтобы ограничить действие redux.

Я использую приведенный ниже код

 export const changeNumber = (number) => (dispatch, getState) => {
  // Clear old timeId
  if (getState().time.timeId !== null) {  
    clearTimeout(getState().time.timeId);
  }
  // Create new timeId
  const timeId = setTimeout(() => {
    
    dispatch(debounceChangeNumber(number));
  }, 1000);
  // refresh to new timeId
  dispatch(updateTimeId(timeId));
  
};

export const debounceChangeNumber = (number) => {
  return {
    type: "CHANGE_NUMBER",
    payload: number,
  };
};

// Throttle redux call, refresh to new timeId
export const updateTimeId = (timeId) => {
  return {
    type: "UPDATE_TIME_ID",
    payload: timeId,
  };
};
 

Довольно сложно использовать то же timeId самое с несколькими действиями, если я использую то же timeId самое, как внутренние действия должны быть асинхронными? Нравится

 const timeId = setTimeout(() => {
    // These actions should be asynchronous
    dispatch(debounceChangeNumber(number));
    dispacth(funcA());
    dispacth(funcB());
    ....
  }, 5000);
 

Я действительно хочу знать, какой наилучший подход для такого рода вещей, потому что, если я использую это в большем приложении, мне нужно создавать новое timeId состояние для каждого компонента.

Ответ №1:

Это довольно сложно сделать самостоятельно, но полезно для обучения.

Для переадресации используйте функцию debounce из библиотеки, которую вы уже используете (например, _.debounce) или получите перехват useDebounce (https://github.com/xnimorz/use-debounce )

Если вы хотите сделать это в учебных целях, это хороший учебник для подражания: https://davidwalsh.name/javascript-debounce-function