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

Node.js中如何在then回调中为全局变量赋值并全局使用?

问题分析

你的代码里console.log(c)返回undefined有两个核心原因:

  1. 异步时序问题:getCity()是异步函数,then()里的赋值操作会在后续事件循环中执行,而同步的console.log(c)会先一步运行,此时c还未被赋值。
  2. 取值错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 19:05:29