Angular2:用于调试的更好/更深的区域堆栈

时间:2016-08-18 07:52:13

标签: angular stack trace zone

Angular2中有没有办法为异步代码获得更好的调用堆栈?我一直认为,跟踪setTimeout(),发出的事件,Promises等的执行上下文是Zone的优势之一吗?

我构建了一个plunker示例,它显示了一个常见的场景,无法跟踪错误。

我有以下示例场景:

@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 {}

Plunker:https://embed.plnkr.co/rnkxRH9G0FzA3DcBHfKO/

这个剪辑会产生异步错误&#34;哦Snap!&#34;单击按钮时。此错误将通过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)

这使我无法在更复杂的应用程序中跟踪实际的错误触发源。

我还嵌入了&#34; long-stack-trace-zone&#34;脚本,完全没有效果。

问题是: 我需要做些什么来获得更好的区域堆栈跟踪?或者它有可能吗?

提前致谢。

1 个答案:

答案 0 :(得分:2)

解决方案是使用&#34; Chrome DevTools&#34;按顺序打破异常。

为此,在Chrome DevTools中,你应该:

  1. Break on uncaught exceptions
  2. 使用Blackboxing以便仅在您感兴趣的代码中打破