【发布时间】:2020-07-08 16:45:53
【问题描述】:
以下代码示例:
async function expectResolutionErrorCode(object) {
try {
await Promise.resolve(1);
object.f1() // caught error
} catch (error) {
object.f2() // uncaught error
}
}
expectResolutionErrorCode(undefined).catch(err => console.log(err));
使用节点 v14 运行时产生以下回溯:
$ node test.ts
TypeError: Cannot read property 'f2' of undefined
at expectResolutionErrorCode (/Users/bogdan/makabu/unstoppable/resolution/test.ts:6:12)
如果我从示例中注释掉第 3 行的 await 语句,则回溯完成:
TypeError: Cannot read property 'f2' of undefined
at expectResolutionErrorCode (/Users/bogdan/makabu/unstoppable/resolution/test.ts:6:12)
at Object.<anonymous> (/Users/bogdan/makabu/unstoppable/resolution/test.ts:10:1)
at Module._compile (internal/modules/cjs/loader.js:1201:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1221:10)
at Module.load (internal/modules/cjs/loader.js:1050:32)
at Function.Module._load (internal/modules/cjs/loader.js:938:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
at internal/main/run_main_module.js:17:47
所以await 语句显然会导致节点丢失部分回溯。
为什么它会这样?
在try catch 中仍然使用await 语句的同时,是否有任何解决方法来维护回溯?
我在 Chrome 和 Safari 中测试了这种行为,堆栈跟踪以几乎相同的方式丢失:https://jsfiddle.net/61kdv8fx/
【问题讨论】:
-
你在编译你的代码吗?对我来说,Node v14 可以很好地显示异步调用跟踪。
-
旁注:您不需要在
await Promise.resolve(1);中使用Promise.resolve(当然它可能有助于强调),await 1;的行为方式完全相同(根据规范)。await在其操作数上有效地调用了Promise.resolve,如果你给Promise.resolve一个构造函数为Promise的promise,它会返回相同的promise;它只包装非承诺值(包括来自 3rd 方库的 thenables)和由不同构造函数(例如子类)创建的承诺。
标签: javascript error-handling try-catch stack-trace