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