#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.