You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Async/Await 异常行为:React useState 更新后控制台输出延迟

问题原因

这和Async/Await有关,但核心是React useState的异步更新机制:

  • setEnviar是异步操作,React为了性能会批量处理状态更新,调用它之后状态不会立刻同步改变,当前函数作用域里的enviar还是更新前的旧值。
  • 你在fetchMenu里用await等待了接口响应,但setEnviar本身的异步特性不受影响。所以刚调用完setEnviar就打印enviar,拿到的是初始的true(第一次点击时)。
  • 第二次点击时,组件已经完成了上一次的状态更新,此时函数里的enviar是更新后的false,所以打印结果符合预期。
解决办法

如果要在状态更新后立刻拿到最新值,有两种简单方式:

  1. 用useEffect监听状态变化
    把依赖最新enviar的逻辑放到useEffect里,状态一变就自动执行:
useEffect(() => {
  console.log(enviar, userSession.user.id);
}, [enviar, userSession.user.id]);
  1. 先存好计算后的新值
    既然已经算出了要设置的新状态,直接把它存成临时变量,之后用这个变量就行:
const fetchMenu= async ()=>{
    const response= await fetch('/api/Menu/ListarMenuPorIdUsuario',{
        method: 'POST',
        body: JSON.stringify({
            IdUsuario:Number(userSession.user.id)
        }),
        headers: {
          'Content-type': 'application/json; charset=UTF-8',
        }
    });
    const data= await response.json();
    // 先把新值存起来
    const newEnviar = !data.Data.some(e=>e.Nombre==="Administrar");
    setEnviar(newEnviar);
    // 直接打印临时变量,拿到的就是最新值
    console.log(newEnviar, userSession.user.id);
}

内容的提问来源于stack exchange,提问作者Gustavo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 12:15:04