2016-11-02 20 views
20

Ngoại lệ không bắt buộc (vòi phun hoặc lỗi ngẫu nhiên) trong bất kỳ thành phần nào trong quá trình khởi động có thể dẫn đến lỗi khởi động.Thông báo về lỗi khởi tạo ứng dụng 2 góc

Do trình duyệt không tương thích nên ứng dụng có thể không bắt đầu quá trình khởi động.

Tôi đang tìm cách thông báo cho người dùng (với cảnh báo, phương thức, v.v) về lỗi nghiêm trọng xảy ra trong khi khởi tạo ứng dụng Angular 2, vì vậy người dùng có thể chắc chắn rằng ứng dụng không chỉ tải mãi mãi mà không thành công một số lý do.

Công thức tốt để xử lý trường hợp này trong Angular 2 là gì?

+1

Làm thế nào về 'platformBrowserDynamic(). BootstrapModule () .catch (err => console.error (err));' – Bhavik

+1

@Bhavik Đó sẽ là một nơi tốt để bắt nó. Nhưng nó không thể bắt 'Không thể giải quyết tất cả các tham số cho ...' lỗi của bộ phun (lời hứa đang chờ xử lý), và ai biết điều gì khác. – estus

+1

@Bhavik Có một lỗi ngăn chặn bootstrapModule hứa hẹn bắt tất cả các lỗi. Nó đã được sửa trong 'master', và cho các phiên bản trước' Promise.resolve(). Then (() => platformBrowserDynamic(). BootstrapModule (...)). Catch (...)) 'giải quyết vấn đề. Vui lòng đăng câu trả lời này như một câu trả lời. – estus

Trả lời

1

PlatformRef.bootstrapModule trở lại là một lời hứa mà chúng ta có thể .catch lỗi, trong khi bootstrap (khởi tạo) ứng dụng.

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

Có một lỗi, đó là just resolved(changelog). Nhờ có @estus, để chỉ ra.

2

Có thể khắc phục điều này với mẫu bị trì hoãn thay đổi. Tuy nhiên, giải pháp dựa trên giả định rằng bootstrapping là đồng bộ và xảy ra trong một lần đánh dấu, điều này có thể sai.

Vẫn không chắc chắn liệu có cách tiếp cận tốt hơn hay không.

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); 
Các vấn đề liên quan