Извлекайте данные из api каждую секунду

#javascript #react-native #express #react-hooks #fetch

Вопрос:

У меня есть собственное приложение react, в котором я получаю заказы, сделанные клиентом, и отображаю их на стороне ресторана на определенном экране, я использую api выборки для получения данных, поэтому рабочий процесс-это заказ клиента на первое место и сохранение его в базе данных, а на стороне ресторана у меня есть эта функция :

 const loadData = async () =gt; {  const response = await fetch(`${API_URL}/getActiveOrders?ID=${id}`);  const result = await response.json();  if (result.auth === true) {   setCurrentOrders(result.data)   } else {  setCurrentOrders([])  }  }   useEffect(() =gt; {  const interval = setInterval(() =gt; {  loadData();  }, 1000)  return () =gt; clearInterval(interval)  }, [id]);  

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

мой вопрос: Является ли это лучшим подходом для выполнения того же сценария (получение заказов в тот момент, когда они были размещены клиентом), или есть лучший способ сделать это без задержек, а также при получении больших данных производительность останется прежней или возникнут некоторые проблемы?

Комментарии:

1. Я не думаю, что вы хотите CurrentOrders , чтобы от вас зависело ваше useEffect . Может id быть, с тех пор, как он используется в loadData

2. @Фил спасибо за это уведомление, я обновлю свой код, в любом случае, у вас есть какие-либо идеи о моей проблеме ? Спасибо.

Ответ №1:

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

Я предлагаю удалить зависимость и запустить эффект только один раз при монтировании компонента, а также очистить интервал при размонтировании.

 useEffect(() =gt; {  const interval = setInterval(() =gt; {  loadData();  }, 1000)  return () =gt; clearInterval(interval) }, []);  

Если id для получения запросов обновляются и вам нужно последнее значение, используйте ссылку React для сохранения id значения и используйте ее в URL-адресе запроса.

 const idRef = React.useRef(id);  useEffect(() =gt; {  idRef.current = id; }, [id]);  const loadData = async () =gt; {  const response = await fetch(`${API_URL}/getActiveOrders?ID=${idRef.current}`);  const result = await response.json();  setCurrentOrders(result.auth ? result.data : []); }  

Комментарии:

1. На самом деле идентификатор всегда остается неизменным, поэтому я думаю, что удаление dep-лучший способ.

Ответ №2:

В этом случае вам следует использовать websockets. Это лучший сценарий для использования websockets. Ваш сценарий похож на торговый веб-сайт.

Комментарии:

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

2. Я дал это в качестве ответа, потому что реализация сценария была неправильной. Это может привести к поломке системы, и это будет стоить дорого (если это управляемая служба). Веб-сайты здесь сэкономят много денег, плюс будет плавная передача данных. Он также может быть легко масштабируемым.

3. Да, для вашего варианта использования определенно требуется websocket.