52ky 发表于 2022-5-3 12:21:05

为什么在 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;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]
查看完整版本: 为什么在 Node.js 中使用异步等待时会丢失堆栈跟踪?