【问题标题】:Notify on Angular 2 app initialization error通知 Angular 2 应用程序初始化错误
【发布时间】:2016-11-02 21:51:51
【问题描述】:

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

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

我正在寻找一种方法来通知用户(使用警报、模式等)在 Angular 2 应用程序初始化期间发生的严重错误,以便用户可以确定应用程序不仅永远加载,而且在某些情况下失败原因。

在 Angular 2 中处理这种情况的好方法是什么?

【问题讨论】:

  • platformBrowserDynamic().bootstrapModule(<AppName>).catch(err => console.error(err));怎么样
  • @Bhavik 那将是捕捉它的好地方。但它无法捕获Can't resolve all parameters for ... 注入器错误(承诺未决),谁知道还有什么。
  • @Bhavik 有一个错误阻止 bootstrapModule 承诺捕获所有错误。它已在master 中修复,对于以前的版本Promise.resolve().then(() => platformBrowserDynamic().bootstrapModule(...)).catch(...)) 解决了该问题。随意发布这个作为答案。

标签: javascript angular typescript


【解决方案1】:

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

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

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

【讨论】:

    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-31
      • 2017-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多