如何在异步函数外部获取其内部更新的全局变量值?
如何在异步函数外部获取其内部更新的全局变量值?
兄弟,你踩了异步代码执行顺序的经典坑啦!我来给你掰扯清楚为啥会这样,以及怎么解决:
问题根源
你定义的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
相关产品推荐
相关产品推荐

