【发布时间】:2021-02-15 20:06:48
【问题描述】:
我有以下 React 组件
const [prjToFetch, setPrjToFetch] = React.useState([]);
React.useEffect(() => {
console.log("Before " + prjToFetch)
async function func(){
let myPromise = await new Promise(function(myResolve, myReject) {
setTimeout(function() { myResolve("I love You !!"); }, 3000);
});
console.log("After: " + prjToFetch)
return myPromise;
}
func()
}, [prjToFetch])
而且我有一个按钮,只要按下它就会将值“a”推入数组 prjFetch:
const handleClick = () => {
setPrjToFetch([...prjToFetch, "a"]);
}
如果我按下按钮一次,前面代码的输出是:
Before a
(3 seconds of idle time)
After a
这正是我所期望的。但是假设我连续按两次按钮,那么输出是:
Before a
Before a a
(3 second of idle time)
After a
After a a
为什么第一个“After”只返回“a”而不返回“a a”?
请注意,我还尝试将代码重写为:
React.useEffect(() => {
console.log("Before " + prjToFetch)
async function func(){
await new Promise(function(myResolve, myReject) {
setTimeout(function() { myResolve("I love You !!"); }, 3000);
});
}
func().then(() => {
console.log("After: " + prjToFetch)
})
}, [prjToFetch])
但结果是一样的
【问题讨论】:
-
"异步函数一直读取全局变量的旧值;e" 变量不是全局的。如果是这样,您将看不到这种行为。 (但你不希望它是全球性的。)
标签: javascript reactjs async-await