JavaScript使用await报仅在async函数有效语法错误是何原因?
运行代码时控制台抛出错误:
Uncaught SyntaxError: await is only valid in async functions and the top level bodies of modules
错误原因
报错核心是await的使用不符合JavaScript语法规则:await关键字仅允许在两种场景下使用:
- 被
async关键字标记的异步函数内部 - ES模块的顶层作用域
你贴出的代码是在普通脚本的全局作用域直接调用await,既没有包裹在async函数内,当前运行环境也没有把该脚本识别为ES模块,因此直接抛出语法错误。
修复方案
你可以根据自己的运行场景二选一:
方案1:将异步逻辑包裹在async函数中(兼容所有支持async/await的环境)
把所有用到await的逻辑放到async标记的函数内部,再调用该函数即可,修改后的代码如下:
let user = { name: 'George', surname: 'Arqael' }; async function regUserRequest() { let regUser = await fetch(url, { method: 'post', headers: { 'Content-type': 'application/json; charset=utf-8' }, body: JSON.stringify(user) }); let result = await regUser.json(); console.log(result); } // 执行异步请求逻辑 regUserRequest();
注意:该方案建议在函数内部添加try/catch块,捕获网络请求失败、响应解析失败等异常,避免出现未捕获的Promise错误。
方案2:使用ES模块顶层await(适配现代运行环境)
如果你的运行环境满足要求(浏览器Chrome 89+/Firefox 89+/Safari 15+、Node.js 14.8+),可以直接将脚本声明为ES模块,无需包裹函数即可直接在顶层使用await:
- 浏览器环境:引入脚本时给script标签添加
type="module"属性<script type="module" src="你的脚本路径.js"></script> - Node.js环境:将脚本后缀改为
.mjs,或者在项目的package.json中添加"type": "module"配置
设置完成后你最初写的代码无需额外修改即可正常运行。
内容的提问来源于stack exchange,提问作者Abul
相关产品推荐
相关产品推荐

