【问题标题】:In the VS Code "Debug Console", run a JavaScript await function在 VS Code“调试控制台”中,运行 JavaScript 等待函数
【发布时间】:2018-11-05 21:47:45
【问题描述】:

在 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();

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

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

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

那么,当函数为async时,真的有办法在VS Code Debug Console中输出函数的结果吗?

【问题讨论】:

  • 是的,当然所有这些都会返回一个承诺。但是,调用main()应该打印结果
  • 你试过await getUrl()吗?不确定 VS Code 是否已经支持 - 节点使用命令行标志。
  • getUrl().then(data => { /*set breakpoint here */ })
  • @Bergi 实际上main() 也返回Promise { pending }。我已经尝试过await getUrl()
  • @JonasW。我正在寻找不需要修改代码的解决方案。如果我真的想要,那么是的,我可以编写打印我想要的代码的代码。但理想情况下,可以从调试控制台获得我想要的。

标签: javascript debugging asynchronous promise visual-studio-code


【解决方案1】:

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

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

【讨论】:

  • 那么...我们可以在调试器中不获取任何东西吗?
  • 或者,我应该问,有没有办法在调试器中取消暂停事件循环?
  • 感谢您指出这一点,我想知道为什么在节点的 REPL 解释器中解决了相同的承诺,但在调试控制台中却没有,所以这意味着我必须从断点恢复应用程序然后尝试运行等待代码尽快在调试控制台中获得已解决的承诺
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-31
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
  • 2021-04-13
  • 2021-05-18
  • 1970-01-01
相关资源
最近更新 更多