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

如何在异步函数外部获取其内部更新的全局变量值?

如何在异步函数外部获取其内部更新的全局变量值?

兄弟,你踩了异步代码执行顺序的经典坑啦!我来给你掰扯清楚为啥会这样,以及怎么解决:

问题根源

你定义的getISS是异步函数,里面的fetch网络请求属于异步操作。当你调用getISS()之后,JavaScript不会傻等着它执行完再走后面的代码,而是直接跳去执行console.log(sat_id)和const data_url = ...这两行。这时候API请求还没返回结果,sat_id自然还是你一开始定义的初始值0,等后面请求完成更新sat_id的时候,后面的代码早就跑完了。

解决方法

给你两种常用的靠谱方案,选哪个看你代码结构:

方案1:用await等待异步函数完成(推荐)

因为getISS是async函数,它返回的是一个Promise,你可以用await来等它执行完再用sat_id。注意await只能在async函数里用,所以我们把主逻辑包在一个立即执行的async函数里就行:

const sat_url = 'https://api.wheretheiss.at/v1/satellites';
let sat_id = 0; 

async function getISS() {
    const response  = await fetch(sat_url);
    const data = await response.json();
    sat_id = data[0].id;
    console.log(sat_id); // 这里能拿到正确的id
}

// 立即执行的async函数,用来包裹需要等待的逻辑
(async function main() {
    await getISS(); // 等着getISS把sat_id更新完
    console.log(sat_id); // 现在就能拿到正确的id啦
    const data_url = 'https://api.wheretheiss.at/v1/satellites/' + sat_id;
    // 后续需要用data_url的代码都可以写在这里
})();

方案2:让异步函数返回结果,用.then处理

如果你不想用立即执行函数,也可以让getISS直接返回拿到的sat_id,然后用.then()来处理后续逻辑:

const sat_url = 'https://api.wheretheiss.at/v1/satellites';

async function getISS() {
    const response  = await fetch(sat_url);
    const data = await response.json();
    const sat_id = data[0].id;
    console.log(sat_id);
    return sat_id; // 把id返回出去
}

// 调用函数后,用then接收返回的id
getISS().then((sat_id) => {
    console.log(sat_id); // 这里拿到正确的id
    const data_url = 'https://api.wheretheiss.at/v1/satellites/' + sat_id;
    // 所有依赖data_url的操作都放在这个回调里
});

额外小建议

尽量别依赖全局变量传值哦,像方案2那样直接返回结果,代码逻辑会更清晰,也不容易出现其他因为全局变量导致的奇怪问题~

备注:内容来源于stack exchange,提问作者Mirco Machmann

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 17:58:13