即使我使用异步代码,Axios get 调用也会返回未定义
2022-06-26
104
对于这段代码:
import { useEffect, useState } from 'react';
import 'ag-grid-community/dist/styles/ag-grid.min.css';
import 'ag-grid-community/dist/styles/ag-theme-material.min.css';
import Grid from '../Common/Grid';
import axios from 'axios';
function GetJudete() {
axios.get("http://localhost:5266/api/judete").then((response) =>
{
let data = response.data;
return data;
}
).catch(err => {
console.log("Eroare la aducerea datelor.");
})
};
function Localitati()
{
let judete;
useEffect(() => {
judete = GetJudete();
}, []);
console.log(judete);
const [columnDefs] = useState([
{ field: 'nume', filter: 'agTextColumnFilter', editable: true },
{ field: 'judetID', filter: 'agTextColumnFilter', editable: true },
])
return (
<Grid
baseLink='http://localhost:5266/api/localitati'
columnDefs={columnDefs}
/>
);
}
export default Localitati;
我的
console.log()
打印未定义。我期望它填充值,因为我在
GetJudete()
中使用了异步代码,方法是使用
Promises
。
但我发现它不能这样工作。
为什么以及我该如何修复此问题?
谢谢。
3个回答
您看到
undefined
有两个主要原因:
-
useEffect
中的代码在渲染后运行。这就是为什么对judete
的任何更新都会在您已记录它之后发生的原因。(一旦正确设置,您需要触发重新渲染才能看到第二行日志。) -
您的
GetJudete
函数没有返回任何内容,这就是为什么您仍然会得到undefined
的原因。(您的承诺确实返回了某些内容,但从未在任何地方使用过。)
以下是解决这两个问题的方法:
import { useEffect, useState } from 'react';
import 'ag-grid-community/dist/styles/ag-grid.min.css';
import 'ag-grid-community/dist/styles/ag-theme-material.min.css';
import Grid from '../Common/Grid';
import axios from 'axios';
async function GetJudete() {
try {
const { data } = await axios.get("http://localhost:5266/api/judete");
return data;
} catch (_) {
console.log("Eroare la aducerea datelor.");
}
};
function Localitati()
{
// Use a state instead of a local variable, so that React knows about updates
const [judete, setJudete] = useState();
useEffect(() => {
async function getJudeteAsync() {
const result = await GetJudete();
setJudete(result);
}
// Trigger the async function from your effect
getJudeteAsync();
}, []);
// The first render will yield "undefined";
// once the AJAX call is successfully done, the setJudete above will cause a re-render and you should see a second log line with an actual value
console.log(judete);
const [columnDefs] = useState([
{ field: 'nume', filter: 'agTextColumnFilter', editable: true },
{ field: 'judetID', filter: 'agTextColumnFilter', editable: true },
])
return (
<Grid
baseLink='http://localhost:5266/api/localitati'
columnDefs={columnDefs}
/>
);
}
export default Localitati;
digitalbreed
2022-06-26
尝试一下
async function getJudate(){
await axios.get(...).then(...)
}
useEffect(() => {
let judate = getJudate()
console.log(judate)
}, [])
Mahmoud Ibrahiam
2022-06-26
您需要在解析后将数据发送到 console.log。
在当前代码中,您在创建组件时打印 judetes。要修复您的问题,您应该在
.then
中调用 console.log,因为它在创建组件后一段时间才解析。
PM75902693
2022-06-26