Как сделать запрос GET к API непрерывно?

#javascript #reactjs

#javascript #reactjs

Вопрос:

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

Редактировать на основе комментариев, которые мне нужны для непрерывного запроса GET, поэтому я обновил вопрос.

Используйте эффект () для установки данных в состояние

 // Data for each of the tags
const [tag1, setTag1] = useState();
const [tag2, setTag2] = useState();
const [tag3, setTag3] = useState();

useEffect(() => {
    axios
        .get(URL)
        .then(res => {
            const data = res.data;
            // Passing in the setter method
            setTagDetails(data, setTag1, setTag2, setTag3);
        })
        .catch(error => {
            console.log(error);
        });
}, []);

  

setTagDetails(), где поступающие данные разделяются на разные состояния, которые будут использоваться в компоненте:

 
// Splitting the data by each corresponding tag and adding them to their respective state
export const setTagDetails = (data, setTag1, setTag2, setTag3) => {
    const arr1 = [];
    const arr2 = [];
    const arr3 = [];
    try {
        data amp;amp;
            data.forEach(d => {
                // Entries into the database which do not have any tag information
                // have a size of 5 and those with all the details have a size of 6
                const sizeOfObject = Object.keys(d).length;
                // Only need database items with all the details
                if (sizeOfObject > 5) {
                    // Split the data for the tags into their respective name
                    const name = d["tags"]["L"][0]["M"]["name"]["S"];
                    // Will be used to set individual datasets for each tag
                    if (name === "Tag1") {
                        cleanTag(d, arr1);
                    }
                    if (name === "Tag2") {
                        cleanTag(d, arr2);
                    }
                    if (name === "Tag3") {
                        cleanTag(d, arr3);
                    }
                }
            });
        setTag1(arr1);
        setTag2(arr2);
        setTag3(arr3);
    } catch (err) {
        console.log(err);
    }
};
  

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

1. это поведение restful services, для захвата последних транзакций в серверной части необходимо отправлять http-запрос по запросу, чтобы получить обновленный ответ.

2. Я вижу, поэтому мне пришлось бы отправлять запрос GET, скажем, каждые 1-2 секунды, чтобы обновлять данные?

3. Вы можете рассмотреть возможность работы с SSE (события, отправленные сервером), чтобы уведомлять клиента об обновлениях сервера developer.mozilla.org/en-US/docs/Web/API/Server-sent_events /…

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

5. да, есть много опций, события, отправляемые сервером, длинный опрос websockets для загрузки нового контента в режиме реального времени

Ответ №1:

Когда вы хотите выполнять функцию каждые x промежутков времени, мы используем метод setInterval . Он будет вызывать переданную функцию (в качестве первого аргумента) каждые x миллисекунд (где x — второй аргумент, в приведенном ниже случае, 1000 мс или 1 секунда).

 useEffect(() => {
const interval = setInterval(() => {
   axios
    .get(URL)
    .then(res => {
        const data = res.data;
        // Passing in the setter method
        setTagDetails(data, setTag1, setTag2, setTag3);
    })
    .catch(error => {
        console.log(error);
    });
  }, 1000);
  return () => clearInterval(interval);
}, []);
  

Пожалуйста, обратите внимание, что лучше всего помнить о подключениях пользователя к Интернету в случае медленной мобильной сети или политики провайдера с ограниченной пропускной способностью. Существует также опасность выполнения запросов так близко друг к другу, что мы вводим условие гонки. Наконец, вы ДОЛЖНЫ очистить интервал, иначе вы значительно снизите производительность вашего приложения.

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

1. Если я передаю элементы из setTag дочерних компонентов, должен ли я также очищать их там или просто в useEffect()?

2. Не уверен, что понимаю ваш вопрос… очистить интервал?

3. Извините, да, я имел в виду очистить интервал. Должен ли я делать это только в useEffect()?

4. Да, поскольку интервал ограничен хуком useEffect.

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