【问题标题】:Why isn't await working with async on firefox为什么不等待在 Firefox 上使用异步
【发布时间】:2019-05-25 04:16:46
【问题描述】:

基本上我有这个功能

async function get(url){
  const response = await fetch(url);
  const resData = await response.text();
  return resData;
}

然后我有这个电话

let data = await get(am_url);

该代码在 google chrome 上完美运行,但在 firefox 上,我在调用行上收到此错误:

SyntaxError: await 仅在异步函数和异步生成器中有效

这里有什么问题,就我的一生而言,我似乎无法在 Firefox 上完成这项工作,也不知道为什么

例如,如果我在 firefox 和 google chrome 上打开 google.com,然后我转到控制台,然后将这段代码粘贴到 chrome 上,它会运行,但在 firefox 上,它会抛出我提到的错误

async function get(url){
  const response = await fetch(url);
  const resData = await response.text();
  return resData;
}

let data = await get("http://google.com");
console.log(data)

【问题讨论】:

  • 听起来像data 可能不在async 函数中?
  • data 不是一个函数,它应该保存响应的文本内容,我尝试从控制台以及从 html 页面的脚本文件中执行它,同样的问题, 适用于 chrome 但不适用于 Firefox
  • 你为什么要等待 response.text() 顺便说一句?
  • @AakashVerma 因为Response.text() 返回一个Promise?
  • 我没有说 data 是一个函数(显然不是),我说它不是 in 一个 async 函数 - 你能发布完整的代码,所以我们有一个minimal reproducible example 来弄清楚?

标签: javascript async-await fetch


【解决方案1】:

在 main 中,要么将下面的代码放入自执行异步函数中,要么使用 .then。

let data = await get(am_url);

应该改为

(async()=>{ let data = await get(am_url) })()

get(am_url).then( data => ....)

【讨论】:

  • 这并不能解释为什么一个浏览器接受它而另一个不接受
  • 我首先尝试了 .then 但它不起作用,那是当我开始尝试不同的东西并最终使用上面的代码时,当我使用 .then 表示法时,有时我得到的数据为null,表示它没有等待响应
  • async get 函数会在遇到 await 时在内部暂停执行。执行完成后,它会将数据传递给 main .then.. 您还可以在 .then 函数之后添加 .catch 以检查 promise 是否返回为 Rejected
【解决方案2】:

正如错误所暗示的,await 仅在 内部 async 函数中起作用。通常你不能像那样使用await,但是你必须先创建一个async函数或者使用.then()而不是await

但是有两点需要注意:

  1. 控制台在async 函数之外支持await,只是为了简化您的生活。 Chrome 先做了,然后是 Firefox 最近。您的示例现在适用于两种浏览器。
  2. 在 ECMAScript 的未来版本中,您将能够在 async 函数之外使用 await,它被称为 "top-level await",因此该代码很快就会在任何地方工作(在 type="module" 上下文中)

【讨论】:

  • 这比投票最多的答案更能解释失败的原因。
【解决方案3】:

在 2018 年提出这个问题时,大多数 JavaScript 控制台都没有在顶层等待。

当时,Google Chrome 开发者工具控制台是个例外。他们在late 2017 in Chrome 62中添加了该功能

这就是为什么在您提出这个问题时使用的 Firefox 版本中,您必须解决承诺,例如使用 then/catch。

如果您更新到当前的 Firefox,例如 72 版(2020 年初),您问题中的代码将有效。正如fregante 在评论中指出的那样,2019 年,Firefox 升级了他们的控制台以支持顶级等待。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-05-14
  • 2013-03-17
  • 1970-01-01
  • 2021-06-23
  • 2022-01-17
  • 2014-12-03
  • 2016-07-07
  • 2016-03-25
相关资源
最近更新 更多