Node.js 14.16.1中调用async函数无法将Promise值存入变量怎么办
JavaScript async函数返回Promise问题解答
问题成因
所有async函数的返回值本质上都是Promise对象,你在getData内部使用的await仅负责暂停函数内部的代码执行、等待异步操作完成,不会改变函数本身返回Promise的特性,因此直接调用getData()拿到的必然是Promise实例,而非异步返回的最终数据。
你遇到的SyntaxError: await is only valid in async function报错,是因为你书写await的位置处于全局或普通函数的同步上下文,JS规范不允许在非async标记的作用域内直接使用await关键字。
可行解决方案
方案1:使用
.then()链式调用处理结果无需修改外层上下文,直接通过Promise原生方法获取返回值:
// 原有getData函数代码保持不变 getData().then(data => { // 所有需要用到data的后续逻辑都必须写在这个回调内 console.log(data) // 后续业务操作... }).catch(err => { // 可选:添加错误捕获逻辑,处理请求失败、JSON解析异常等问题 console.error('请求出错:', err) })方案2:用立即执行async函数包裹逻辑
如果你更习惯
await语法,可以手动创建合法的async作用域:// 原有getData函数代码保持不变 (async () => { const data = await getData() // 所有需要用到data的后续逻辑都写在这个立即执行函数内 console.log(data) // 后续业务操作... })()方案3:开启顶层await支持(仅限符合环境要求场景)
如果你使用的Node.js版本 >= 14.8,或是在遵循ESM规范的前端项目中,可以将JS文件后缀改为
.mjs,或是在项目package.json中添加配置"type": "module",即可直接在全局顶层使用await,不会再报语法错误:const data = await getData() console.log(data)
注意:所有依赖
getData返回结果的逻辑,必须放在上述异步上下文中执行,不能在全局同步代码里直接访问最终数据,否则必然只能拿到pending状态的Promise。
内容的提问来源于stack exchange,提问作者Caio César P. Ricciuti
相关产品推荐
相关产品推荐

