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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:41:15