Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在vscode中调试Promise调用堆栈_Javascript_Node.js_Visual Studio Code_Es6 Promise - Fatal编程技术网

Javascript 在vscode中调试Promise调用堆栈

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()调用中的函数之一。首先,所示的调用堆栈

在vscode中调试nodeJS承诺时,是否有方法获取调用堆栈?我看到中支持异步调用堆栈,但它似乎属于vanilla JS回调

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

我正在节点v6.9.x上运行

编辑:在launch.json配置中添加
“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
,但是这里发生的事情有很好的解释。