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

API响应无法返回问题排查:这段异步代码为何无返回值?

问题分析与修复方案

问题根源

你写的代码里用了async/await,但request是回调风格的API,它不会返回Promise,所以await根本没法等待异步请求完成。函数会直接跳到return weatherStats这行,此时weatherStats还是初始的undefined,而回调里的赋值要等请求结束后才执行,自然拿不到预期的返回值。另外,回调里的错误只做了console.log,不会抛到外层的try/catch,出问题也没法被捕获处理。

修复方案

有两种靠谱的修复方式:

方式1:手动把request包装成Promise

把回调式的请求转为Promise,这样就能用async/await正确等待结果:

import request from 'request';

export const findWeatherStats = async () => {
  try {
    const weatherStats = await new Promise((resolve, reject) => {
      request(
        "https://api.openweathermap.org/data/2.5/weather?lat=6.9270786&lon=79.861243&appid={appid}&units=metric",
        { json: true },
        (err, res, body) => {
          if (err) {
            reject(err); // 把错误抛给外层catch处理
            return;
          }
          resolve(body); // 请求成功时返回数据
        }
      );
    });
    console.log(weatherStats);
    return weatherStats;
  } catch (e) {
    throw e;
  }
};

方式2:用request的Promise版本(更推荐)

request有官方的Promise化版本request-promise-native,用它写代码更简洁:
首先安装依赖:

npm install request-promise-native

然后修改代码:

import rp from 'request-promise-native';

export const findWeatherStats = async () => {
  try {
    const weatherStats = await rp({
      uri: "https://api.openweathermap.org/data/2.5/weather?lat=6.9270786&lon=79.861243&appid={appid}&units=metric",
      json: true
    });
    console.log(weatherStats);
    return weatherStats;
  } catch (e) {
    throw e;
  }
};

额外提醒

  • 记得把代码里的{appid}替换成你自己的OpenWeatherMap API密钥,不然请求会失败。
  • 尽量别用any类型,建议定义一个WeatherStats接口来约束返回数据的结构,让代码更健壮。

内容的提问来源于stack exchange,提问作者Pankaja Chalaru

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 21:25:22