Javascript 在vscode中调试Promise调用堆栈
在vscode中调试nodeJS承诺时,是否有方法获取调用堆栈?我看到中支持异步调用堆栈,但它似乎属于vanilla JS回调 现在,当我在断点上暂停时,调用堆栈很小,即使我知道这个函数是从另一个(两个)函数调用的 我正在节点v6.9.x上运行 编辑:在launch.json配置中添加Javascript 在vscode中调试Promise调用堆栈,javascript,node.js,visual-studio-code,es6-promise,Javascript,Node.js,Visual Studio Code,Es6 Promise,在vscode中调试nodeJS承诺时,是否有方法获取调用堆栈?我看到中支持异步调用堆栈,但它似乎属于vanilla JS回调 现在,当我在断点上暂停时,调用堆栈很小,即使我知道这个函数是从另一个(两个)函数调用的 我正在节点v6.9.x上运行 编辑:在launch.json配置中添加“protocol”:“inspector”属性会添加更多StackFrame,但这没有多大帮助: 我所有的函数都返回承诺,屏幕截图中的函数被调用为Promise.All()调用中的函数之一。首先,所示的调用堆栈
“protocol”:“inspector”
属性会添加更多StackFrame,但这没有多大帮助:
我所有的函数都返回承诺,屏幕截图中的函数被调用为
Promise.All()
调用中的函数之一。首先,所示的调用堆栈是正确的,因为这些函数实际上在堆栈上。当围绕异步回调创建承诺时,。然后
附加处理程序,同步执行结束,调用堆栈展开。当回调回调回调somewhen时,它解析承诺和。然后执行处理程序。此时,调用堆栈仅包含传递给的函数
现在,在许多场景中,承诺链是扁平的,并且与创建承诺链的方式相反:
function a() {
return Promise.resolve(1).then(it => it + 1); // 1
}
function b() {
return a().then(it => it + 1); // 2
}
在上面执行第一个.then
回调(1)时,唯一附加的回调是(2),因此引擎可以生成“async stacktrace”,显示承诺链在哪些函数继续
现在对于普通承诺来说,仅仅为了生成stacktrace而解析这些链是一个很大的开销,但是对于异步函数
s,等待
承诺来说,这是非常简单的。因此,由于nodejsv12(以及在现代浏览器中),如果您这样编写上述内容:
异步函数a(){
常量结果=(等待1);
_log_stack();
返回结果+1;
}
异步函数b(){
返回(等待a())+1;
}
b();
函数_log_stack(){console.log((new Error()).stack)}
在launch.json中是否有“协议”:“inspector”
?除非您已经有了node v8,否则默认值为“legacy”。我确实注意到启动调试器时会收到一条legacy debugging警告,但不确定它是节点版本的一部分还是vscode节点调试器的功能。请参见此处的详细信息:我已添加了您指定的配置,但是我没有得到与示例中所示的相同的输出。我更新了问题:您是否尝试将断点添加到承诺本身返回的函数中?您应该能够运行,直到回调返回,然后跳转到promise函数中的断点。这个问题已经很老了,我已经转到了async
/await
,但是这里发生的事情有很好的解释。