#javascript #reactjs #api #asynchronous #async-await
Вопрос:
Я новичок в том, чтобы реагировать. Поэтому я разрабатываю приложение, которое получает данные из api. Поэтому я использовал этот фрагмент кода для получения данных из api.
let [jsonData,setJsonData]=useState([]);
useEffect(() => {
async function fetchData() {
try {
const response = await fetch(apiURL);
const json = await response.json();
setJsonData(json.components.map(function(item){
return item;
}))
} catch (error) { }
}
fetchData();
}, [])
const [table1,table2,pieChart]=jsonData;
console.log(table1,table2,pieChart)
В этом-то и проблема. Когда я запускаю это, я получаю такой вывод.
В этом, почему в первом вызове есть два выхода, и в первом выводе, почему я получаю 3 неопределенных вещи.Мне просто нужно получить только те данные JSON при первом вызове.Как мне получить только необходимые данные и не получать эти неопределенные вещи.
Заранее спасибо.
Ответ №1:
Вы не можете избежать того факта, что ваша функция выборки является асинхронной, но вы можете сделать что-то вроде этого:
if (!jsonData.length) return <div>loading...</div>;
Комментарии:
1. Есть ли какой-либо способ дождаться других процессов, пока я не получу данные из api?
2. @TharinduGimras вы можете создать компонент более высокого уровня оболочки, который ожидает завершения чего-либо и отображает подкомпонент только тогда, когда данные есть. Или вы можете использовать «неизвестность». Хотя и то, и другое довольно сложно. Я настоятельно рекомендую вам начать с простой версии. Просто не визуализируйте, пока данные не появятся. Это буквально утверждение 1 if.
3. Большое спасибо, я понял, в чем дело. Я так и сделаю.
Ответ №2:
Вы выполняете асинхронный запрос в своей функции useEffect, что означает, что ваша функция выборки будет выполняться параллельно текущему коду, но она завершится через некоторое время. Итак, в первый раз вы утешаете.запишите те значения, которые эффект использования еще не завершен. В конце вашего эффекта использования вы использовали setJsonData, который приведет к повторному отображению компонента в обновленном состоянии, поэтому вы видите вторую консоль.наконец-то войдите в журнал с правильными значениями.
Комментарии:
1. Ах, вот почему я получаю два таких вывода. Есть ли какой-нибудь способ подождать, пока я не получу эти правильные значения?
2. Вы можете извлечь эти данные из родительского компонента и отобразить этот компонент только в том случае, если эти значения не определены.