当前位置: 首页 > 知识库问答 >
问题:

全局调用异步函数出错:"wait仅在异步函数和模块的顶层主体中有效"?

都博裕
2023-03-14

在开始之前,我承认有几个问题可能听起来与我的标题类似,但是,我读到的所有问题都比我的代码更复杂,解释似乎与我的情况无关。

有人能帮我理解我的代码(下面的代码片段)中发生了什么导致了这个错误吗

未捕获SyntaxError:await仅在异步函数和顶级模块体中有效。

据我所见,导致错误的wait位于“顶层”主体中。或者是顶级身体的其他意思?谢谢!

编辑区别于其他建议(类似)的问题在这里:我的问题不涉及http获取,一些其他的上下文是不同的,最重要的是,我已经收到了一个答案,解决了我的问题,不像在(孤独的)答案中给出的建议其他问题。因此,虽然我在这里找到了解决办法,但我相信我的问题对广大观众来说是有价值的。

var data;
await getData();
document.body.write(data);

async function getData() {
    const res = await fetch("https://jsonplaceholder.typicode.com/posts", {
        method: 'GET',
        headers: {
          'Accept': 'application/json, text/plain, */*',
          'Content-type': 'application/json'
        }
    });
    data = await res.json();
}

共有2个答案

咸育
2023-03-14

是的,它是全局代码-在我的脚本中。js文件。我想还有什么比这更“顶级”的呢?

正如在一篇评论中指出的,问题不是“顶层”,而是“在一个模块中”。

只有当type属性表明要将脚本作为模块加载时,Web浏览器才会将其作为模块加载:

<script type="module" src="script.js"></script>

这将支持导入(CORS允许),使脚本异步加载,并停止顶层范围全局。

萧丁雨
2023-03-14

顶级await表示您试图在async函数之外使用async/await语法。解决方法是创建一些函数,例如main,并将代码放入其中。

async function main() {
  var data;
  await getData();
  document.body.write(data);
}

main();

有一天,顶级异步/等待将得到支持,并有一个建议。同时,您可以使用这个Babel插件来使用它https://babeljs.io/docs/en/babel-plugin-syntax-top-level-await没有包装器功能,如main

 类似资料:
  • 试图使一个chrome扩展刮一个网站,但它总是在内容完全加载之前(在manifest.json的文档读取后尝试) 每次有人叫我: 还尝试:

  • 我正在做一些非常简单的测试,关于使用csvtojson节点模块将csv文件读取为json格式,我使用下面的代码作为模板 我主要关注的是 //异步/等待使用 const jsonArray=wait csv()。fromFile(csvFilePath); 代码的部分。这是我的密码 无论我用哪种方法尝试,我总是会出现以下错误 或 如果我把代码转换成顶级的 我不明白这为什么不起作用。 编辑:我做了@t

  • 我在Sequelize的节点8上。js 当尝试使用时,出现以下错误。 代码: 获取以下错误: 我做错了什么?

  • 错误出现在第1行,我从Ganache获取帐户,但仅对有效 我应该对此代码进行哪些更改以删除错误?请帮帮我。 如果我删除这一行,错误表明它无法访问帐户,并且在此之后,不起作用。 有没有办法把这段代码做成ASYNC函数的形式?

  • 我正在尝试设置一些数据在使用这个节点js代码的FIRESTAR: 在控制台中运行文件: 给我这个错误: 如何解决这个问题

  • 我有一个异步函数,它在代码中的某个地方按setInterval运行。此函数定期更新一些缓存。 我还有一个不同的同步函数,它需要检索值——最好是从缓存中检索,但如果是缓存未命中,则从数据源检索(我意识到以同步方式进行IO操作是不明智的,但假设在这种情况下需要这样做)。 我的问题是,我希望同步函数能够等待异步函数中的值,但是不可能在非异步函数中使用关键字: 现在,通过将中的逻辑提取到一个新的同步函数中