reactjs - 异步函数后变量未初始化
问题描述
我提出这样的要求:
const createProgramari = async () => {
let prog = [];
try {
await axios.get('http://localhost:8000/api/programariByDentistID', {
params: {
id: JSON.parse(localStorage.getItem('user'))["id"]
}
})
.then(function (res) {
console.log(res);
if(res.status === 200) {
prog = res.data;
}
})
.catch(function (error) {
console.log(error);
});
setProgramari(prog);
} catch(e) {
console.log(e);
}
}
如果我尝试在我的 useEffect 中看到这个,变量“programari”是一个空数组(我初始化它的值)
const [programari, setProgramari] = useState([]);
useEffect( () => {
// code to run on component mount
createProgramari();
console.log(programari);
}, [])
我尝试打印响应并且 axios 正确。我究竟做错了什么?有没有一个地方我可以学习如何不犯同样的错误?
解决方案
这里的重点是setProgramari
本质上是异步的。如果它被调用,并不一定意味着它会立即执行。您可以处理此问题的一种方法如下。
useEffect(() => {
createProgramari();
}, []);
// consider useMemo or useCallback based on your use case if need be
useEffect(() => {
// whatever logic you want to have
console.log(programari); // will get new value always
}, [programari])
推荐阅读
- node.js - 如何根据文档的当前值更新猫鼬中的多个文档
- php - 访问发送到回调 URL 的数据
- java - 从 spring boot 1.4.2.RELEASE 升级到 2.5.3 后未检测到外部 jar
- tradingview-api - 你知道如何修复安全功能的参数应该没有副作用吗?
- python - 主窗口冻结然后单击按钮 PyQt5
- mysql - DBeaver 导出到 csv:“未选择数据库”
- python - 使用 python 脚本,我想根据另一列(现有)更新 MySQL-DB 中的列(新),并在 excel 文件中提供列映射
- javascript - 带分号的问号语句,如果为真则执行多项操作
- python - I need to print unique words of the value of list
- firebase - Firestore 文档更新失败