2017-11-19 7 views
0

Ich programmiere eine App mit IONIC und Typoskript. Ich habe einen Speicheranbieter und einen Netzwerkanbieter erstellt (siehe Pseudocode unten).IONIC stellen Sie sicher, dass der Dienst vor geladen wird

Storage-Anbieter

class SettingsService { 
    settings; 
    constructor(private storage: Storage) { 
     storage.get("settings").then((data) => this.settings = data); 
    } 

    getSettings() { 
     return this.settings; 
    } 
} 

Netzbetreiber

class NetworkService { 
    constructor(private http: http, private settingsService: SettingsService) {} 

    getData() { 
     settings = this.settingsService.getSettings(); 
     //Do more stuff 
    } 
} 

Wenn ich getData() die Funktion nun aufrufen kann es vorkommen, dass die Einstellungen nicht definiert ist, weil die SettingsService noch die Einstellungen geladen ist. Wie kann ich im NetworkProvider warten bis die Einstellungen vollständig geladen sind?

Momentan verwende ich setTimeout, um zu prüfen, ob die Einstellungen bereits geladen sind. Aber ich bin nicht glücklich damit.

Danke für Ihre Hilfe :)

Antwort

1

Wie wäre es mit Versprechungen?

Etwas wie folgt vor:

class SettingsService { 
    settings = null; 

    constructor(private storage: Storage) { 

    } 

    getSettings(): Promise<{}> { 

     return new Promise((resolve) => { 
      if (settings !== null) { 
       resolve(settings); 
      } else { 
       this.storage.get("settings").then((data) => { 
        this.settings = data 
        resolve(this.settings); 
       }); 
      } 
     }); 
    } 
} 

class NetworkService { 
    constructor(private http: http, private settingsService: SettingsService) {} 

    getData() { 
     this.settingsService.getSettings().then((settings) => { 
     //Do more stuff 
     }); 
    } 
    } 

Auch ich denke, dass Speicher Leistungen gut sind, so vielleicht könnten Sie auch die Einstellungen ersparen Variable in SettingsService und nur immer den Wert aus dem Speicher ... aber ich don‘ t kennen Ihre App natürlich nur eine Idee

PS: nicht vergessen, dass die Lagerung sollte erst nach dem platform.ready()

+0

Vielen Dank für Ihre Antwort. Es funktioniert gut. Aber gibt es eine Möglichkeit zu warten, bis die Einstellungen geladen sind, anstatt sie zu laden, wenn sie noch nicht geladen sind? – Peter234

+1

Cool zu wissen, dass es funktioniert. Ich verstehe deine Frage nicht, sorry. Doing 'this.storage.get (" settings "). Dann ((data) =>' lass dich warten, bis die Daten geladen sind. –

+0

Mein Fehler, sorry. Eigentlich lade ich die Einstellungen im Konstruktor des SettingsService und in der Methode getSettings() mache ich ein paar Sachen mit den Einstellungen, bevor ich sie zurückschicke, also möchte ich in getSettings warten, bis der Konstruktor die Einstellungen fertig geladen hat .. – Peter234

0

Storage-Anbieter

verwendet werden
class SettingsService { 
    settings; 
    constructor(private storage: Storage) {} 

    getSettings() { 
     return storage.get("settings");   
} 

Netzbetreiber

class NetworkService { 
    constructor(private http: http, private settingsService: SettingsService) {} 

    getData() { 
     let settings; 
     this.settingsService.getSettings().subscribe(_settings => settings=_settings; 

    } 
} 
Verwandte Themen