【问题标题】:How to execute async functions in VSCode debugger? [duplicate]如何在 VSCode 调试器中执行异步函数? [复制]
【发布时间】:2021-03-07 19:49:38
【问题描述】:

如果我在一些 javascript 代码中放入 VSCode 调试器并使用 await 调用异步函数,它只会返回一个 Promise。如何在调试器中解析 promise 以便查看结果?

例如,如果我这样定义一个函数:

const doAsyncThing = async () => {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve(5)
        }, 1000)
    })
}

然后当我在调试器中调用它时会发生这种情况:

> const result = await doAsyncThing()
Promise {<pending>}
> result
Uncaught ReferenceError: result is not defined
> doAsyncThing().then(r => console.log(r))
Promise {<pending>}
> await doAsyncThing().then(r => console.log(r))
Promise {<pending>}

我怎样才能让它解决承诺并在调试器中得到结果?

这不是How to debug async/await in visual studio code?的重复项

这个问题似乎是在询问如何在异步函数中放置断点,而我正试图从调试器中实际执行该函数。

我在新帖子here 中重新创建了这个问题,因为我不认为它与上述帖子重复。这是我第一次发帖,希望这是正确的做法。

【问题讨论】:

  • 这能回答你的问题吗? How to debug async/await in visual studio code?
  • 一个异步函数根据定义返回一个promise。在承诺完成之前没有结果。编辑器或调试器不会改变它。如果您想获得结果,您需要等待承诺完成并处理结果 - 使用 await 或 .then
  • 如果您尝试在浏览器中调试脚本,标有async 的函数仍会返回一个承诺
  • @DaniloIvanovic 谢谢,但不,这没有回答。我正在尝试从调试器中调用该函数,我更新了我的问题以表明这一点。
  • @PanagiotisKanavos 谢谢,但我尝试在调试器中同时使用await 和.then,但都没有解决承诺。我已经更新了问题。

标签: javascript node.js visual-studio-code async-await


【解决方案1】:

也许在函数调用前加一个“await”?

【讨论】:

  • 谢谢,但即使我这样做,它仍然会返回一个承诺,请参阅我更新的问题
  • 嗯。我很确定调试器只能立即打印出结果给定的语句将返回解释。如果沿途有异步和/或超时,它不会“等待”它,而是返回等待它的东西。我只是将“setTimeout(() => { console.log(1) }, 1000)” 放入我的调试器中。它立即打印一个 Timeout 对象实例。然后1秒后,“1”来了。因此,如果您没有从上面的示例中获得“5”,您可能想要“继续 (F5)”您的调试会话?
  • "doAsyncThing().then(r => console.log(r) )" 在这里我从你的例子中得到“5”。由于我在范围内定义了 doAsyncThing,因此我在其中设置了一个断点,在粘贴并执行 sn-p 之后,我需要“继续 (F5)”并等待输出。
【解决方案2】:

你可以这样做:

const result = await Promise.resolve("success");
debugger

然后在 VSCode 中运行调试器。

【讨论】:

  • 换句话说,使用await
  • 嗨@wuliu,谢谢,但我想做的是从调试器调用异步代码,而不是在现有代码中放入调试器。我更新了我的问题以反映这一点。
猜你喜欢
  • 2020-05-06
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
  • 2020-06-07
  • 1970-01-01
  • 2014-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多