Javascript 为什么我的异步函数总是返回一个挂起的承诺?

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

当我console.log(data)时,我会记录我需要的信息,但是如果在getWeather()中返回数据的值,它只会返回一个挂起的承诺。我试过很多东西,但到目前为止都没有成功。我会在下面留下我的坏代码

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()
位)内部运行该函数,该回调只会在检索数据后运行