dsi*_*cos 5 javascript error-handling stack-trace node.js async-await
当我运行以下程序时
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);
});
Run Code Online (Sandbox Code Playgroud)
我得到以下输出,该输出通过各种调用的函数打印堆栈
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)
Run Code Online (Sandbox Code Playgroud)
但是,在以下程序的await调用后引发错误时
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);
});
Run Code Online (Sandbox Code Playgroud)
这是输出
Error: Error here prints incomplete stack
at functionOne (/home/divyanshu/programming/errorHandlingAsyncAwait/index.js:7:9)
at <anonymous>
Run Code Online (Sandbox Code Playgroud)
我想了解为什么在第二种情况下而不在第一种情况下丢失堆栈跟踪。
因为在第一个代码中,直到的所有内容都Error位于事件循环的同一滴答中。
在异步回调之前,来自的回调setTimeout可以进入调用堆栈(堆栈跟踪是从该堆栈建立的),调用堆栈必须为空。
因此,由于第一个代码在Error调用之前一直同步运行所有内容,因此所有这些调用都在调用堆栈中。但在第二种方法中,Error被称为后,await荷兰国际集团一个setTimeout电话。当setTimeout完成。事件循环将回调放回堆栈中,为此,调用堆栈必须为空。
因此,现在,调用堆栈上没有functionTwo&functionThree,这就是为什么它们不出现的原因。
Ť 他堆栈跟踪堆栈时出错内容时发生的状态。
这是两个代码中堆栈发生的情况的粗略解释:
第一码
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
Run Code Online (Sandbox Code Playgroud)
第二码
1) functionThree is pushed into the stack
2) functionTwo is pushed into the stack
3) functionOne is pushed into the stack
4) awat ...setTimeout is called
5) All 3 functions return a Promise
6) The stack is empty
... setTimeout ends
Next tick of the event loop
1) setTimeout callback is called
2) Error is thrown
Run Code Online (Sandbox Code Playgroud)
我建议观看此视频以了解所有这些工作原理:
无论如何,Philip Roberts 的事件循环到底是什么
在最新版本的Node.js上,--async-stack-traces当使用异步代码时,可以使用flag来改善堆栈跟踪。
您可以在https://v8.dev/blog/fast-async阅读更多有关此的内容
| 归档时间: |
|
| 查看次数: |
1389 次 |
| 最近记录: |