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

Node/Express中async函数外变量值异常及日志顺序问题求助

问题:异步函数执行顺序导致变量值未更新的疑惑

在Node/Express环境中,我从后端获取全局变量loggedIn的值(用户登录时为1,未登录时为0),用来决定加载哪个头部。用户A已登录,但代码执行结果却不符合预期:

let loggedIn = 0 // 变量已在函数外声明,为全局变量

async function checkLoggedIn () { // 检查用户登录状态的函数
    const res = await fetch('users/authenticate')
    const loggedInString = await res.json()
    loggedIn = parseInt(loggedInString)
    console.log(loggedIn) // 此处正确输出'1',因为用户A已登录
}

checkLoggedIn() // 调用该函数

console.log(loggedIn) // 此处仍输出'0',尽管用户A已登录

浏览器日志输出顺序如下:

0 (index):12 // 函数外的变量值
1 (index):7 // 函数内的变量值

明明checkLoggedIn()在console.log(loggedIn)之前调用,为什么后者先输出,且变量值还是初始的0?


解答

这是JavaScript异步机制导致的,核心是异步函数的非阻塞执行特性:

  • checkLoggedIn()是异步函数,调用它时,JS引擎不会等待内部的fetch网络请求完成,而是直接跳过它,继续执行后面的console.log(loggedIn)。这时候loggedIn还没被异步请求的结果修改,自然输出初始值0。
  • 只有当fetch请求完成并返回数据后,才会继续执行await之后的代码:把返回的字符串转为数字赋值给loggedIn,然后打印1。这个过程发生在后续的事件循环中,所以日志顺序是0先出,1后出。

如果要确保在loggedIn更新后再访问它,有两种常用方式:

  1. 用then回调处理异步完成后的逻辑:
checkLoggedIn().then(() => {
    console.log(loggedIn); // 这里会输出更新后的1
});
  1. 在async函数中通过await等待异步函数完成:
async function init() {
    await checkLoggedIn();
    console.log(loggedIn); // 这里会输出更新后的1
}
init();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:16:02