Uncaught SyntaxError:await调用async函数报错,需优先加载页面内容
解决思路
方案1:使用立即执行的异步函数(IIFE)
这是最直接修复语法错误的方式,将await包裹在一个自执行的async函数中,既符合语法规则,又能执行异步操作:
<div id="divProducts"></div> <script> (async () => { try { await LoadProducts(); // 产品加载完成后,可在此执行后续逻辑 } catch (err) { console.error('产品加载失败:', err); } })(); </script>
注意:这种方式下,后续脚本仍会同步执行,如果需要确保后续脚本在产品加载完成后再运行,需结合方案3的动态加载逻辑。
方案2:将脚本标记为ES模块
ES模块允许在顶层作用域使用await,只需给script标签添加type="module"属性:
<div id="divProducts"></div> <script type="module"> try { await LoadProducts(); // 产品加载完成后的逻辑 } catch (err) { console.error('产品加载失败:', err); } </script>
提示:模块脚本默认是延迟执行(defer)的,会在DOM解析完成后运行;如果你的LoadProducts定义在外部JS文件中,需要通过import语句引入(确保全局可用的话可跳过)。
方案3:用Promise的.then()控制执行顺序
由于LoadProducts返回Promise,可通过.then()明确控制后续代码/脚本的执行时机,完美匹配你“在其他脚本运行前加载内容”的需求:
<div id="divProducts"></div> <script> LoadProducts() .then(() => { // 产品加载完成后,动态加载并执行后续脚本 const nextScript = document.createElement('script'); nextScript.src = '你的后续脚本路径.js'; // 若后续是内联脚本,可直接写在这里: // console.log('产品加载完成,执行后续逻辑'); document.body.appendChild(nextScript); }) .catch(err => { console.error('产品加载失败:', err); }); </script>
这种方式能确保后续脚本只有在产品加载完成后才会执行,完全满足你的顺序要求。
额外优化建议
你的LoadProducts函数本身是async函数,但手动创建了Promise,可简化写法(不影响功能,仅代码更简洁、语义更清晰):
async function LoadProducts() { return new Promise((resolve, reject) => { PageMethods.set_path('/xxx/xxxx.aspx'); PageMethods.GetToken(OnSuccess, OnError); function OnSuccess(Token) { const settings = { "url": "xxx", "method": "POST", "timeout": 0, "headers": { "Token": Token, "Content-Type": "application/json; charset=UTF-8" }, "data": JSON.stringify({ "xxx": xxx }), }; $.ajax(settings).done(function (response) { $("#divProducts").append(response); // 注意:原代码用了Ret,应该是response resolve(''); }).fail(reject); // 捕获ajax请求错误,避免静默失败 } function OnError(Error) { reject('error'); // 用reject而非resolve,更符合Promise错误处理语义 } }); }
内容的提问来源于stack exchange,提问作者Christos Bokos
相关产品推荐
相关产品推荐

