为何将API调用结果存入cat变量时控制台输出Promise {<pending>}?
为什么调用async函数后控制台输出Promise {}?
嘿,这个问题其实是async/await机制里很常见的入门坑,我来给你掰扯清楚:
核心原因:async函数的返回值特性
所有async函数不管内部逻辑如何,默认都会返回一个Promise对象——哪怕你return的是一个普通值,它也会被自动包装成已resolved状态的Promise;如果函数还在执行异步操作(比如你的代码里的await got(...)还没完成),那这个Promise就会处于<pending>(待处理)状态。
你代码里的let cat = dog();这一步,只是调用了async函数dog,但并没有等待它内部的异步请求完成,所以cat拿到的就是还没完成的Promise实例,自然打印出来就是Promise {<pending>}了。
怎么拿到真正的响应结果?
有两种常用方式来获取async函数的最终返回值:
1. 在async函数内部用await等待(推荐,代码更简洁)
因为await只能在async函数里使用,所以你可以把打印逻辑放到一个async函数里:
const got = require('got'); let dog = async () => { try { const response = await got('https://api.coinpaprika.com/v1/coins/btc-bitcoin'); return response; } catch (error) { console.log(error.response.body); // 这里最好抛出错误,让外部能捕获到失败情况 throw error; } } // 新增一个async函数来处理结果 async function fetchAndLog() { let cat = await dog(); console.log(cat); // 这里就能拿到真正的响应对象了 } fetchAndLog();
2. 用Promise的.then()链式调用
既然async函数返回的是Promise,那我们可以直接用Promise的then方法来处理成功的结果:
dog().then(cat => { console.log(cat); // 异步完成后执行这里 }).catch(error => { // 处理请求失败的情况 console.error('请求出错:', error); });
额外小提示
你的dog函数里,catch块只打印了错误但没有抛出,这会导致如果请求失败,Promise会resolve为undefined,外部无法通过catch捕获到错误。所以建议在catch里加上throw error,这样外部的await或者.then().catch()就能正确处理失败场景啦。
内容的提问来源于stack exchange,提问作者Julian Martinez
相关产品推荐
相关产品推荐

