Как выполнять запросы один за другим в useEffect

У меня есть useEffect, который выполняет запрос при изменении зависимостей (отдел и два поля дат).

useEffect(() => {
    getFilteredRestReport({
      date_start: formatDatePatchPoint(date[0]),
      date_end: formatDatePatchPoint(date[1]),
      department,
    });
  }, [date, department])

Когда я делаю запрос с пустым отделом, запрос выполняется долго, и если во время этого запроса я делаю запрос, например, для какого-то отдела, то он будет выполнен сначала, чем без отдела, но потом, когда загружается запрос без отделов, он заменит данные, хотя в фильтре спереди у меня выбран последний отдел запроса. И вопрос в том, как остановить ненужный запрос, или как выполнять запросы по одному?

Я пытался сделать это с помощью async/await

const request = async () => {
    await getFilteredRestReport({     
      date_start: formatDatePatchPoint(date[0]),
      date_end: formatDatePatchPoint(date[1]),
      department,
    });
  };

  useEffect(() => {
    request()
  }, [date, department]);

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

schnondle 14.07.2024 05:17

вы можете подождать несколько секунд с помощью setTimeout, прежде чем отправлять http-запрос.

mmm 14.07.2024 06:55

@schnondle, можешь написать пример?

Smokeguap 14.07.2024 06:57

@ммм, я думаю, это ухудшает пользовательский опыт

Smokeguap 14.07.2024 06:59

конечно, вы должны сообщить об этом пользователю во время ожидания.

mmm 14.07.2024 07:02

Что делает getFilteredRestReport при вызове? По сути, это звучит так, как будто вам нужно интегрировать AbortController и прерывать любые текущие запросы при выполнении следующего запроса. Пожалуйста, отредактируйте свое сообщение, включив в него полный минимально воспроизводимый пример соответствующего кода, с которым вы работаете.

Drew Reese 14.07.2024 08:37
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
6
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Зная, что это функция asyncThunk, можно узнать из следующей документации. Это должно работать:

useEffect(() => {
  const reportPromise = getFilteredRestReport({
    date_start: formatDatePatchPoint(date[0]),
    date_end: formatDatePatchPoint(date[1]),
    department,
   });
  
  return () => {
    reportPromise.abort();
  }
}, [date, department])

getFilteredRestReport свою функцию createAsyncThunk, и я пишу ответ на состояние редукции, а затем использую это состояние в компоненте

Smokeguap 14.07.2024 07:45

О, при использовании функции createAsyncThunk вам нужна диспетчеризация для ее вызова, это делается с помощью диспетчеризации = useDispatch(), а затем вам нужно отправить функцию диспетчеризации asyncthunk(getFilteredRestReport({params})), если это все еще не выполняется. работа, у меня тоже должно быть решение для этого!

justnut 14.07.2024 07:57

да, я знаю это, я использую bindActionCreators из redux, чтобы использовать такие действия, как функции поддержки.

Smokeguap 14.07.2024 08:02

Другие вопросы по теме