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
相关产品推荐
相关产品推荐

