Node.js中如何在then回调中为全局变量赋值并全局使用?
问题分析
你的代码里console.log(c)返回undefined有两个核心原因:
- 异步时序问题:
getCity()是异步函数,then()里的赋值操作会在后续事件循环中执行,而同步的console.log(c)会先一步运行,此时c还未被赋值。 - 取值错误:
getCity()函数已经返回了data.city(字符串类型),但你在then()里却尝试取value.city,这会得到undefined,相当于给c赋了无效值。
正确实现方式
方式一:用async/await统一处理异步逻辑
把主逻辑放在async函数里,等待异步操作完成后再访问变量:
let city; let c; async function getCity() { let apiKey = '9ddf7197ff9633535259c99aa0716c329981d1514f05e2e1e2015803'; let response = await fetch(`https://api.ipdata.co?api-key=${apiKey}`); let data = await response.json(); city = data.city; return city; } // 用async函数包裹主逻辑 async function init() { try { c = await getCity(); console.log(c); // 此时能正确输出城市名 // 所有需要使用c的代码都放在这里或者之后执行 } catch (error) { console.log(error); } } init();
方式二:将依赖变量的逻辑放在then回调内
如果不想用async/await,确保所有需要使用c的代码都在then()的成功回调里执行:
let city; let c; async function getCity() { let apiKey = '9ddf7197ff9633535259c99aa0716c329981d1514f05e2e1e2015803'; let response = await fetch(`https://api.ipdata.co?api-key=${apiKey}`); let data = await response.json(); city = data.city; return city; } getCity().then( function (value) { c = value; // 直接用value,因为getCity返回的就是city字符串 console.log(c); // 正确输出 // 其他需要使用c的逻辑都写在这里 }, function (error) { console.log(error) } );
关于全局变量的说明
如果要让c或city在全局可用,只要它们是在全局作用域声明的(比如你代码里的写法),在异步操作完成后,整个代码的其他部分都能访问到它们,但必须确保访问操作是在赋值完成之后执行。如果有其他模块需要使用这个变量,最好通过异步函数返回值的方式传递,而非依赖全局变量(避免时序问题)。
内容的提问来源于stack exchange,提问作者Prabhat Rai
相关产品推荐
相关产品推荐

