Javascript 为什么我的异步函数总是返回一个挂起的承诺?
当我console.log(data)时,我会记录我需要的信息,但是如果在getWeather()中返回数据的值,它只会返回一个挂起的承诺。我试过很多东西,但到目前为止都没有成功。我会在下面留下我的坏代码Javascript 为什么我的异步函数总是返回一个挂起的承诺?,javascript,async-await,axios,Javascript,Async Await,Axios,当我console.log(data)时,我会记录我需要的信息,但是如果在getWeather()中返回数据的值,它只会返回一个挂起的承诺。我试过很多东西,但到目前为止都没有成功。我会在下面留下我的坏代码 const axios = require('axios'); const getWeather = async () => { try { let response = await axios.get( 'http://api.openw
const axios = require('axios');
const getWeather = async () => {
try {
let response = await axios.get(
'http://api.openweathermap.org/data/2.5/forecast?id=524901&appid={apiKey}'
);
let data = response.data;
return data;
} catch (e) {
console.log(e);
}
};
async function returnAsync() {
const x = await getWeather();
return x;
}
console.log(getWeather()); // returns a pending promise
console.log('check ', returnAsync()); // also returns a pending promise
//const getWeather=async()=>{ 异步函数的返回值将是一个承诺,它将使用异步函数返回的值进行解析,或者使用异步函数引发的异常或异步函数中未捕获的异常进行拒绝 更多信息请访问
这可能与您试图在同步函数中调用异步函数有关。这是一个很常见的错误,所以不要担心。通常,如果您考虑结构,控制台日志可以在异步函数完成之前运行。这就是为什么我们有“回调函数”基本上只要异步返回一个值就可以运行 Axios有一种非常简洁的方法来使用这些回调,它只使用
.then()
函数
因此,请尝试一下,看看它是否有效:
const axios=require('axios');
const getWeather=async()=>{
axios.get()http://api.openweathermap.org/data/2.5/forecast?id=524901&appid={apiKey}')
.then(json=>console.log(json))
.catch(错误=>console.log(错误))
};
getWeather();
由于您试图在异步函数内部调用get请求,因此无法在同步函数中获取数据。
async
函数必须返回承诺。(它们隐式返回promise
,而不是void
!)
异步函数总是返回一个承诺。如果异步函数的返回值不是显式的承诺,它将隐式地包装在承诺中
例如,以下各项:
async function foo() {
return 1
}
…相当于:
function foo() {
return Promise.resolve(1)
}
async
函数返回一个承诺;这就是全部要点。实际上,它们应该返回一个承诺;wait
表达式总是产生一个承诺。这回答了你的问题吗?只是一个注释,JS没有void
的概念。你可能从TS@ChayimFriedman是的,我是一个技术开发人员,是吗最好指定未定义的
?没问题,我只是想说,为了将来的访问者,请看,但是我如何将API中的数据存储在另一个变量中?我将不得不在程序的另一部分中使用此数据。因此规则是,您可以在异步函数中运行同步函数,但不能在异步函数中运行同步函数。因此,通常您希望围绕异步函数调整程序的方向,这会使您的生活更加轻松。因此,如果您有另一个使用数据的函数,我将从异步函数回调(.then()
位)内部运行该函数,该回调只会在检索数据后运行