Почему мои данные не обновляются при вызове одного API и хорошо обновляются при вызове другого?

#reactjs #axios

#reactjs #axios

Вопрос:

Я пытаюсь создать панель мониторинга данных covid-19 в реальном времени с помощью React. Данные поступают из desease.sh api и глобальные показатели регулярно меняются, поэтому я отправляю новый запрос в конечную точку api, чтобы получить новые данные с помощью setInterval через минуту. Но когда происходит этот новый запрос, данные в моем приложении не меняются.

Ниже приведен мой код для api disease. Который работает не так, как ожидалось

 function CoolTest() {
    const [data, setData] = useState([]);

    const getData = async () => {
        try {
            const data = await axios.get("https://disease.sh/v3/covid-19/all");
            setData(data.data);

        } catch (e) {
            console.log(e)
        }
    };    
    
    useEffect(() => {
        getData();
        setInterval(()=>{
            getData();
            setData(data => data)            
    }, 120000)
    }, []);

    console.log(data.todayCases)       

    
    return (
        <Container style={{marginTop:'15px'}}>
            <h3>New Cases</h3>
            <p className="text-muted"> {data.todayCases}</p>
            <hr />
        </Container>
    )
}
 

Затем, используя тот же код, я попытался сделать запрос к api шуток Чака Норриса, который работает. Шутка меняется после каждого нового запроса.

 function CoolTest() {
    const [jokes, setJokes] = useState([]);

    const getJokesData = async () => {
        try {
            const data = await axios.get("https://api.chucknorris.io/jokes/random");
            setJokes(data.data);

        } catch (e) {
            console.log(e)
        }
    };    
    
    useEffect(() => {
        getJokesData();
        setInterval(()=>{
            getJokesData();
            setJokes(jokes => jokes)            
    }, 120000)
    }, []);

    console.log(jokes.value)   

    
    return (
        <Container style={{marginTop:'15px'}}>
            <h3>Chuck Norris Jokes</h3>
            <p className="text-muted"> {jokes.value}</p>
            <hr />
        </Container>
    )
}
 

Чего мне не хватает?

Скриншот Concole. введите описание изображения здесь

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

1. Есть ли какие-либо ошибки в консоли? Возможно, вы получаете ограниченную скорость

2. Смотрите консоль, есть ошибка, если она опубликована

3. Я прикрепил скриншот консоли выше. там же, где я регистрирую вывод из API, не определено.

4. почему вы делаете setJokes(jokes => jokes) ? вы устанавливаете функцию вместо значений данных

5. @dev-cc Я предположил, потому что я уже установил значения для шуток в функции getJokesData(); setJokes(шутки => шутки) просто заменяет старые значения шуток новыми значениями, полученными после setInterval . По крайней мере, это то, что сказал учебник, который я просмотрел.

Ответ №1:

Данные не меняются, потому что новые данные совпадают с предыдущими.

вы можете изменить:

 const data = await axios.get("https://disease.sh/v3/covid-19/all");
setData(data.data);
 

Для

 const data = await axios.get("https://disease.sh/v3/covid-19/all");
setData({ todayCases: Math.random() });
 

чтобы увидеть, что представление меняется.

в вашем втором коде имя api api.chucknorris.io/jokes/random

и каждый раз выдает вам случайное число, которое не равно предыдущему.

вы можете увидеть результаты этой песочницы

а также изменить:

       setInterval(()=>{
            getJokesData();
    }, 120000)
 

Для:

       setInterval(()=>{
            getJokesData();
            setJokes(jokes => jokes)            
      }, 120000)```

 

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

1. Для первого, когда я изменил setData({ todayCases: Math.random() }); Я успешно получаю случайное число. После интервала

2. второе работало, потому что вы получаете случайные данные. если вы проверите devtool / network, вы увидите, что в data.todayCases изменений нет (в первом коде)

3. это проблема, которую я пытаюсь решить. Потому что данные меняются в api. Я могу это сделать, когда вручную проверяю конечную точку API болезни. Я наблюдал это в течение 30 минут при слишком открытых вкладках. Один из них с запущенным моим приложением и консольной регистрацией значения todayCase, которое остается неизменным, и все же, когда я случайным образом обновил вкладку с конечной точкой open api, значение для todayCase изменилось. Что может быть причиной того, что мое приложение не получает новые значения даже при изменении данных в api