GET请求中可打印userData属性却无法返回该对象的技术咨询
问题:异步请求中能打印数据却无法返回对象?
你提到在getStats函数里,能通过console.log正常输出userData.name和userData.summonerLevel,但没法把userData作为对象返回,赋值给变量完全失效。你的代码如下:
function getStats() { https.get(`https://euw1.api.riotgames.com/lol/summoner/v3/summoners/by-name/yojimbozx?api_key=${API_KEY}`, (res) => { let userData = '' res.on('data', (chunk) => { userData += chunk }) res.on('end', () => { userData = JSON.parse(userData) if(!userData.hasOwnProperty('status')) { console.log(userData.name, userData.summonerLevel) return userData } return console.log("Summoner not found") }) }).on("error", (err) => { return console.log("Error: " + err.message) }) }
问题根源:异步操作的特性
这里的核心问题是**https.get是异步操作**——你的return userData语句写在end回调函数里,这个回调要等请求完全完成后才会执行,但getStats函数本身会在发起请求后立刻执行完毕,根本等不到回调里的返回值。
简单说:getStats函数早就执行完返回了undefined,而你要的userData是在很久之后的回调里才生成的,这时候再返回已经没人接收了。
解决方案:用Promise处理异步返回
要解决这个问题,你需要把getStats改成返回一个Promise,这样就能在请求完成后拿到数据:
function getStats() { return new Promise((resolve, reject) => { https.get(`https://euw1.api.riotgames.com/lol/summoner/v3/summoners/by-name/yojimbozx?api_key=${API_KEY}`, (res) => { let userData = ''; res.on('data', (chunk) => { userData += chunk; }); res.on('end', () => { userData = JSON.parse(userData); if (!userData.hasOwnProperty('status')) { console.log(userData.name, userData.summonerLevel); resolve(userData); // 成功时用resolve返回数据 } else { reject(new Error("Summoner not found")); // 失败时用reject抛出错误 } }); }).on("error", (err) => { reject(new Error("Error: " + err.message)); // 请求错误时也抛出错误 }); }); }
然后你就可以这样使用这个函数:
// 用async/await方式(更直观) async function fetchUserData() { try { const data = await getStats(); console.log(data); // 这里就能拿到返回的userData对象了 // 后续处理data的逻辑 } catch (err) { console.error(err.message); } } fetchUserData(); // 或者用.then/.catch方式 getStats() .then(data => { console.log(data); // 处理数据 }) .catch(err => { console.error(err.message); });
补充说明
- 异步操作的返回值不能用普通的
return,因为函数执行和异步结果的产生是不同步的,Promise是目前处理异步逻辑的标准方式。 - 你之前的
return console.log(...)其实也没意义,因为回调里的return不会影响外层的getStats函数返回值。
内容的提问来源于stack exchange,提问作者Asaf Aviv
相关产品推荐
相关产品推荐

