JavaScript中调用async函数得到Promise { <pending> } 如何解决?
JavaScript async函数返回值问题解答
问题原因
- 所有
async函数的返回值都会被自动包装为Promise对象:函数内部return的普通值会作为Promise resolve的结果,函数抛出的错误会作为Promise reject的原因。 - 第一种写法中直接调用
getData()后立即打印结果,此时异步操作还未执行完成,Promise处于pending状态,因此控制台输出Promise { <pending> }。 - 把打印逻辑放在
await语句之后时,await会暂停当前async函数的执行,等待后续Promise执行完成并拿到resolve结果后,才会执行后续的打印逻辑,因此可以正常输出预期值。
补充:你调用someService时仅传入1个参数,但该函数定义接收3个入参,需要注意参数匹配是否符合业务逻辑要求。
正确获取async函数返回值的方法
有两种通用方案可以拿到async函数的执行结果:
方案1:使用await接收
await只能在async函数内部使用,新版浏览器/Node.js环境也支持ES模块下的顶层await:
顶层await写法(ES模块支持)
const data = await getData() console.log(data)
兼容旧环境的自执行async函数写法
;(async () => { try { const data = await getData() console.log(data) } catch (error) { console.log('请求出错:', error) } })()
方案2:使用.then()链式调用
getData() .then(data => { console.log(data) }) .catch(error => { console.log('请求出错:', error) })
注意:你当前的getData函数在catch错误后仅打印日志没有抛出错误,若需要外层感知到请求失败,可在catch块中添加throw error语句,否则请求出错时外层拿到的结果会是undefined。
内容的提问来源于stack exchange,提问作者Saurabh
相关产品推荐
相关产品推荐

