2016-11-02 21 views
20

बूटस्ट्रैप के दौरान किसी भी घटक में एक अपरिचित अपवाद (इंजेक्टर या सिर्फ यादृच्छिक त्रुटि) बूटस्ट्रैप विफलता का कारण बन सकता है।कोणीय 2 एप प्रारंभिक त्रुटि

ब्राउज़र असंगतता के कारण ऐप बूटस्ट्रैप प्रक्रिया शुरू नहीं कर सकता है।

मैं एक तरह से गंभीर समस्या के पर कि कोणीय 2 एप्लिकेशन आरंभीकरण के दौरान हुआ (चेतावनी, मोडल, आदि के साथ) एक उपयोगकर्ता को सूचित करने के लिए देख रहा हूँ, तो एक उपयोगकर्ता यह सुनिश्चित करें कि एप्लिकेशन अभी नहीं हमेशा के लिए लोड हो जाता है हो सकता है लेकिन के लिए असफल कुछ कारण।

कोणीय 2 में इस मामले को संभालने के लिए अच्छी नुस्खा क्या है?

+1

'प्लेटफार्म ब्रोसर डायनेमिक() बूटस्ट्रैप मॉड्यूल () .catch (err => console.error (err)); ' – Bhavik

+1

@ भाविक यह पकड़ने के लिए एक अच्छी जगह होगी। लेकिन यह 'सभी पैरामीटर को हल नहीं कर सकता ...' इंजेक्टर त्रुटियों (वादा लंबित है) को पकड़ नहीं सकता है, और कौन जानता है कि और क्या है। – estus

+1

@ भाविक एक बग था जिसने बूटस्ट्रैप मॉड्यूल को सभी त्रुटियों को पकड़ने से वादा किया था। इसे 'मास्टर' में और पिछले संस्करणों के लिए 'Promise.resolve()। (() => PlatformBrowserDynamic() बूटस्ट्रैप मॉड्यूल (...))। पकड़ (...))' समस्या हल करती है। इसे उत्तर के रूप में पोस्ट करने के लिए स्वतंत्र महसूस करें। – estus

उत्तर

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); 
संबंधित मुद्दे