在 VS Code“调试控制台”中,运行 JavaScript await 函数

Gar*_*ary 12 javascript debugging asynchronous promise visual-studio-code

在 VS Code 的“调试控制台”中,我可以在调试 JavaScript 代码(包括运行我的函数)时在调试会话中间评估我的代码上的表达式。但是,async即使使用 IIFE 等,我似乎也无法运行函数。

我有以下代码:

const axios = require('axios');

async function getUrl() {
  const response = await axios.get('http://example.com/');
  return response.data;
}

async function main() {
  const response = await getUrl();
  console.log(response);
}

main();
Run Code Online (Sandbox Code Playgroud)

async function main() {在行上设置了一个断点,然后我运行了 VS Code Debugger。然后我尝试运行getUrl在调试控制台不同的方式,如函数getUrl()getUrl().then((data) => data)(async () => getUrl())(),而这一切的回报Promise { pending })。main()返回相同的(如果在函数定义之后运行)。这些方法都不打印函数的返回值。

我也试过await getUrl(),它返回SyntaxError: await is only valid in async function

我知道我可以在代码中输出我想要的函数console.log,如果真的有必要,但我正在寻找一种解决方案,专门使用调试控制台来打印专门使用await函数创建的承诺的结果。

因此,当函数为 时,是否真的有任何方法可以在 VS Code 调试控制台中输出函数的结果async

And*_*cik 19

VS Code 调试控制台支持顶级异步/等待(https://github.com/microsoft/vscode-js-debug#top-level-await),但问题可能是您在断点处暂停。

如果你在断点处暂停时使用await,你只会得到一个待处理的Promise。这是因为 JavaScript 事件循环在断点处暂停。

  • 那么...我们可以在调试器中什么也得不到吗? (14认同)
  • 启用此功能的请求在 [833928 - DevTools: 调试器暂停时控制台的等待不起作用 - chromium](https://bugs.chromium.org/p/chromium/issues/detail?id= 833928#c10): *“没有解决此问题的方法,也没有计划解决此问题。这里的问题是,在调试中断期间运行微任务队列严重违反了网页的常规行为。当您等待承诺时,期望的是处理程序在脚本完成后运行,并且您将运行微任务队列。在断点处,这不会发生。”* (6认同)

hun*_*aro 13

@jonas-wilms 在对原始问题的评论中有正确的想法。

@andrej-k 有一个很好的观点,即事件循环已暂停。

async将它们放在一起,以下是在 VS Code 调试控制台中的断点处暂停时从函数获取输出的方法:

// config.entry() is an async function

config.entry().then((result) => { debugger; })
Run Code Online (Sandbox Code Playgroud)

config.entry是一个异步函数

config.entry 是一个异步函数

调用函数.then()debugger;

使用具有调试器的 .then() 调用函数;

result.then()回调中转储

将结果转储到 .then() 回调中