为什么在 Node.js 中使用异步等待时会丢失堆栈跟踪?
问题当我运行以下程序时
async function functionOne() {
throw new Error('Error here prints the complete stack');
await new Promise((resolve) => {
setTimeout(() => { resolve(); }, 1000);
});
}
async function functionTwo() {
await functionOne();
}
async function functionThree() {
await functionTwo();
}
functionThree()
.catch((error) => {
console.error(error);
});
我得到以下输出,它通过各种调用函数打印堆栈
Error: Error here prints the complete stack
at functionOne (/home/divyanshu/programming/errorHandlingAsyncAwait/index.js:3:9)
at functionTwo (/home/divyanshu/programming/errorHandlingAsyncAwait/index.js:11:9)
at functionThree (/home/divyanshu/programming/errorHandlingAsyncAwait/index.js:15:9)
at Object.<anonymous> (/home/divyanshu/programming/errorHandlingAsyncAwait/index.js:18:1)
at Module._compile (module.js:612:30)
at Object.Module._extensions..js (module.js:623:10)
at Module.load (module.js:531:32)
at tryModuleLoad (module.js:494:12)
at Function.Module._load (module.js:486:3)
at Function.Module.runMain (module.js:653:10)
但是,当在以下程序中的等待调用后抛出错误时
async function functionOne() {
await new Promise((resolve) => {
setTimeout(() => { resolve(); }, 1000);
});
throw new Error('Error here prints incomplete stack');
}
async function functionTwo() {
await functionOne();
}
async function functionThree() {
await functionTwo();
}
functionThree()
.catch((error) => {
console.error(error);
});
这是输出
Error: Error here prints incomplete stack
at functionOne (/home/divyanshu/programming/errorHandlingAsyncAwait/index.js:7:9)
at <anonymous>
我想知道为什么堆栈跟踪在第二种情况下丢失了,但在第一种情况下没有。
回答
因为在第一个代码中,直到 Error 的所有内容都在事件循环的同一滴答声中。
在异步回调之前,来自 setTimeout 的调用堆栈可以进入调用堆栈(堆栈跟踪是从中构建的),调用堆栈必须为空。
因此,由于第一个代码在调用 Error 之前同步运行所有内容,因此所有这些调用都在调用堆栈上。但是在第二种方法中,在调用Error之后调用了await。当 setTimeout 完成时。事件循环将回调放回堆栈,为此,调用堆栈必须为空。
所以现在,没有 setTimeout &amp;amp;代码>在调用堆栈上,所以它们不会出现。
堆栈跟踪是错误发生时堆栈的状态。
以下是这两个代码中堆栈的粗略解释:
第一个代码
功能二
第二个代码
功能三
我建议观看此视频以了解所有这些是如何工作的:
菲利普·罗伯茨到底是什么&#39; “事件循环”
1) functionThree is pushed into the stack
2) functionTwo is pushed into the stack
3) functionOne is pushed into the stack
4) Error is thrown
在最新版本的 Node.js 中,您可以使用
页:
[1]