通知Angular 2应用程序初始化错误

时间:2016-11-02 21:51:51

标签: javascript angular typescript

引导期间任何组件中未捕获的异常(注入器或随机错误)都可能导致引导失败。

由于浏览器不兼容,应用程序可能根本无法启动引导过程。

我正在寻找一种方法来通知用户(使用警报,模态等)处理Angular 2应用初始化期间发生的严重错误,因此用户可以确定该应用不仅会永久加载,而且会失败出于某种原因。

在Angular 2中处理此案例的好方法是什么?

2 个答案:

答案 0 :(得分:2)

可以通过更改延迟模式来解决此问题。但是,该解决方案基于这样的假设:自举是同步的并且发生在一个滴答中,这可能是错误的。

仍然不确定是否有更好的方法。

class InitDeferred {
  promise: Promise<any>;
  private fulfilled: boolean;

  constructor() {
    this.promise = new Promise((resolve, reject) => {
      setTimeout(() => this.fulfilled === true ? resolve() : reject('init error'));
    });
  }

  resolve() {
    this.fulfilled = true;
  }

  reject() {
    this.fulfilled = false;
  }
}

const initDeferred = new InitDeferred;
export default initDeferred;
@Injectable()
export class InitErrorHandler extends ErrorHandler {
    handleError(error: any): void {
      initDeferred.reject();
      super.handleError(error);
    }
}

@Component(...)
export class App extends OnInit {
  ngOnInit() {
    initDeferred.resolve();
  }
}

@NgModule({
  ...
  providers: [{ provide: ErrorHandler, useClass: InitErrorHandler }]
})
export class AppModule {}
initDeferred.promise.catch(alert);
platformBrowserDynamic().bootstrapModule(AppModule);

答案 1 :(得分:1)

PlatformRef.bootstrapModule返回一个承诺,我们可以.catch错误,同时bootstrap(初始化)应用。

platformBrowserDynamic().bootstrapModule(<AppName>)
    .catch(er‌​r => console.error(err));

有一个错误,just resolved(changelog)。感谢@estus,指出它。