gpt4 book ai didi

javascript - 在 vscode 中调试 Promise 调用堆栈

转载 作者:行者123 更新时间:2023-12-05 00:24:39 31 4
gpt4 key购买 nike

在vscode中调试nodeJS Promises时有没有办法获取调用堆栈?我看到 this GitHub issue 支持异步调用堆栈。但看起来它与 Vanilla JS 回调有关。

现在,当我在断点处暂停时,调用堆栈很小,即使我知道这个函数是从另一个(几个)函数调用的。

我在 Node v6.9.x 上运行

debug break no stack

编辑 : 添加 "protocol": "inspector" launch.json 配置的属性增加了一些堆栈帧,但它不是很有帮助:debug break next tick

我的所有函数都返回 promise ,并且屏幕截图中的函数被调用为 Promise.all() 中的函数之一称呼。

最佳答案

首先,如图所示的调用堆栈是正确的,因为这些是实际在堆栈上的函数。当围绕异步回调创建 Promise 时,.then处理程序被附加,同步执行结束,调用堆栈被解包。当回调在某个时候回调时,它会解析 Promise 和 .then处理程序被执行。此时,调用堆栈仅包含传递给 .then 的函数。 .
现在在很多情况下,Promise 链是扁平的,并且以另一种方式创建:

function a() {
return Promise.resolve(1).then(it => it + 1); // 1
}

function b() {
return a().then(it => it + 1); // 2
}
在上述第一个 .then回调 (1) 执行,唯一附加的回调是 (2),因此他的引擎可以生成“异步堆栈跟踪”,显示 Promise 链在哪些函数处继续。
现在对于简单的 Promise 来说,解决这些链只是为了生成一个堆栈跟踪是很多开销,但是对于 async functionawait promise 它非常简单。因此,从 NodeJS v12(以及在现代浏览器中)开始,如果您像这样编写上面的代码:

async function a() {
const result = (await 1);
_log_stack();
return result + 1;
}

async function b() {
return (await a()) + 1;
}

b();

function _log_stack() { console.log((new Error()).stack); }

然后您的调试器将显示正确的异步堆栈跟踪(如上所述生成)。你可以找到更深入的解释 here .

关于javascript - 在 vscode 中调试 Promise 调用堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44338830/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com