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更新后再访问它,有两种常用方式:
- 用
then回调处理异步完成后的逻辑:
checkLoggedIn().then(() => { console.log(loggedIn); // 这里会输出更新后的1 });
- 在async函数中通过
await等待异步函数完成:
async function init() { await checkLoggedIn(); console.log(loggedIn); // 这里会输出更新后的1 } init();
内容的提问来源于stack exchange,提问作者Vemb
相关产品推荐
相关产品推荐

