有没有办法在Angular2中获得更好的异步代码调用堆栈?我一直认为,跟踪setTimeout()、发出的事件、Promises等的执行上下文是Zone的优势之一。
我构建了一个柱塞示例,它显示了一个常见的场景,使得无法跟踪错误。
我有以下示例场景:
@Component({
selector: 'my-component',
template: `
<div>
<button (click)="doSmth()">Cause an async error!</button>
</div>
`
})
export class MyComponent {
@Output() error = new EventEmitter<any>(true);
public doSmth(): void {
this.error.emit('Oh snap!');
}
}
@Component({
selector: 'my-app',
template: `
<div>
<my-component (error)="handleError($event)"></my-component>
</div>
`,
})
export class App {
private error = "";
public handleError(reason: any): void {
Promise.reject(reason)
}
}
@NgModule({
imports: [ BrowserModule ],
declarations: [ App, MyComponent ],
bootstrap: [ App ]
})
export class AppModule {}
砰砰作响:https://embed.plnkr.co/rnkxRH9G0FzA3DcBHfKO/
这个剪辑在按钮被点击时产生一个异步错误"Oh Snap!"这个错误将通过EventEmitter发出,它将在App组件中处理,只会导致未处理的Promise拒绝。
我现在得到的调用堆栈看起来像这样:
Error: Oh Snap!
at resolvePromise (zone.js:538)
at Function.ZoneAwarePromise.reject (zone.js:594)
at App.handleError (app.ts:34)
at DebugAppView._View_App0._handle_error_3_0 (App.ngfactory.js:82) //not my file
at eval (core.umd.js:12718)
at eval (core.umd.js:9180)
at ZoneDelegate.invokeTask (zone.js:356)
at Object.onInvokeTask (core.umd.js:9236)
at ZoneDelegate.invokeTask (zone.js:355)
at Zone.runTask (zone.js:256)
这将使我没有机会在更复杂的应用程序中跟踪实际的错误触发源。
我还嵌入了"long-stack-trace-zone"脚本,它没有任何效果。
问题是:我要做什么才能得到更好的区域堆栈跟踪?或者这是可能的吗?
一个解决方案是使用"Chrome DevTools"的顺序中断的例外。
为此,在Chrome DevTools中,您应该:
- 未捕获异常的中断
- 使用黑盒,以便仅在您感兴趣的代码中中断