在调试Node.js代码时,我经常会遇到不包含程序代码的调用堆栈,只有node_modules /非用户代码,尽管当前的执行行是在我的代码中的某个位置。这违背了跟随调用堆栈通过我的应用程序代码查看执行路径的目的。
为什么我的源文件没有显示在调用堆栈中?
答案 0 :(得分:3)
看起来你正在查看异步堆栈跟踪,其中你的代码不在堆栈中,除了你的回调,因为你的代码解开/完成,然后调用了异步回调。
所有promises的所有.then()
处理程序都与一个干净的堆栈异步调用。这是承诺规范。因此,promises总是让当前的执行线程完成并展开,然后在调用回调时,它们会在堆栈上没有用户代码的情况下触发.then()
个处理程序。您所描述的是同步代码如何工作,而不是异步代码。如果您展示实际代码并描述您在调用堆栈的位置,我们可以更具体地讨论,而不是理论上。
异步进度通常必须通过日志记录进行跟踪,因为您无法轻松单步执行它,您也不能只是打破并查看堆栈跟踪。
作为一个更简单的例子来看:
function foo() {
setTimeout(() => {
console.log("timer"); // set breakpoint here
}, 100);
}
foo();
函数foo()
已经完成执行并在调用回调之前返回,因此堆栈跟踪将不会包含任何代码(除了回调之外)。
虽然.then()
处理程序使用的调度程序与setTimeout()
略有不同,但原理是相同的。