【问题标题】:await outside of async function doesn't throw error in console异步函数之外的等待不会在控制台中引发错误
【发布时间】:2019-05-23 03:47:54
【问题描述】:

MDN says:

请记住,await 关键字仅在 async 函数内部有效。如果你在 async 函数体之外使用它,你会得到一个 SyntaxError

但事实并非如此。

在 DevTools 控制台中尝试此代码,没有错误,只是结果:

async function a(val) { return val; }
await a(10) // await is not inside async function
10

代码或文档有什么问题?

【问题讨论】:

  • 即使只是一个简单的await 10; 打印10
  • await Promise.resolve(10)
  • 好像已经支持了快一年了:chromium.googlesource.com/chromium/src.git/+/…
  • 它在根级别上工作,但你总是在程序中编写函数,如果不使函数异步就不能使用 await

标签: javascript asynchronous async-await console google-chrome-devtools


【解决方案1】:

MDN 文档是正确的,它解释了它在 JavaScript 中的工作原理。

这只是 DevTools 添加的一项功能,可让您更轻松地测试 async/await 代码。而且它不是 JavaScript 功能。

它似乎自 2017 年 11 月 8 日起在 DevTools 中得到支持:

https://chromium.googlesource.com/chromium/src.git/+/e8111c396fef38da6654093433b4be93bed01dce

如果你发现了

ConsoleModel.js

在第 129 行,它们具有评估标记为异步的表达式的功能:

async evaluateCommandInConsole

【讨论】:

    【解决方案2】:

    没有错。

    您找到了special feature of the DevTools consoleto make it as easy as possible 在现场环境中试验 async-await 代码。您可以想象您在控制台中输入的任何代码都会自动包装在 async 函数中。事实上,正如另一个答案所指出的那样,这正是发生的事情。

    请务必注意,即使这在控制台中有效,但它不是 JavaScript 的功能。

    因此,您的所有观察结果都是正确且符合预期的! MDN 文档是准确的,因为如果您尝试在 await 函数之外使用 await 的页面上加载脚本,则会出错。另一方面,DevTools 控制台旨在完成这项工作(专门针对开发人员的人体工程学设计),因此您的代码在控制台中运行时不会出现任何错误。

    这不是唯一的trick the DevTools console has up its sleeve。一般来说,如果您真的想测试某些代码如何在页面上运行,最好在页面上实际运行脚本,而不是在控制台中。

    【讨论】:

      猜你喜欢
      • 2023-03-04
      • 2022-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 2021-10-22
      • 2019-08-18
      相关资源
      最近更新 更多