2017-10-17 2 views
0

Bei der Protokollierung auf der Konsole wird beim ersten Laden der Seite der folgende Code foo: undefined generiert, bei nachfolgenden Aktualisierungen wird jedoch foo: bar generiert.Beim Laden der anfänglichen Seite wird kein lokaler Speicherwert abgerufen

ionViewDidLoad() { 
    let foo = this.storage.get('foo'); 

    Promise.all([ 
     foo 
    ]).then((result) => { 
     this.foo = result[0]; 
     this.doSomething(); 
    }); 
} 

doSomething() { 
    console.log('foo: ' + this.foo); 
} 

Ich verstehe diese asynchron ist, kann aber nicht herausfinden, wie der Wert aus dem Speicher bei der ersten Seite zu laden, zu bekommen, damit ich es in meiner Ansicht angezeigt werden kann. Ich dachte, ich mache das richtig? ...

+0

Sie benötigen –

+0

Sie müssen verwenden ngoninit ngoninit verwenden. Es ist ein Lebenszyklushaken. –

Antwort

0

Ein paar Dinge: Sie müssen nicht in eine Promise.all wickeln, weil es bereits ein Versprechen ist und weiter Promise.all ist für die Kombination mehrerer Versprechen in eine. Außerdem müssen Sie nicht auf ionViewDidLoad warten, um etwas aus dem Speicher zu holen, Sie können dies direkt im Konstruktor tun. Ich habe Ihren Code in einen Konstruktor verschoben und dem Versprechen einen Erfolgs- und Fehlerrückruf hinzugefügt. Ich habe auch eine andere Lösung mit async/await Syntax:

public foo; 
constructor(...) { 
    this.platform.ready().then(ready => { 
    this.storage.get('foo').then(
     result => { 
     this.foo = result[0]; 
     this.doSomething(); 
     }, 
     error => { 
     console.error(error); 
     }, 
    ); 

    this.doSomethingElse(); 
    } 
} 

doSomething() { 
    console.log('foo: ' + this.foo); 
} 

async doSomethingElse() { 
    let bar = await this.storage.get('bar'); 
    console.log('bar: ' + bar); 
} 
+0

Ich habe dein erstes Beispiel dafür gemacht, es in den Konstruktor zu setzen und 'Uncaught (in promise) zu erhalten: TypeError: Kann die Eigenschaft' 0 'von null nicht lesen. Ich weiß, es gibt einen Wert in Speicher bc, wenn ich es im Protokoll aktualisieren aktualisiert. – timgavin

+0

Sie müssen wahrscheinlich auf das plattformfähige Ereignis warten. Ich werde meine Antwort aktualisieren. – David

+0

Es stellte sich heraus, dass es sich um eine Race Condition handelte, also arbeitete ich trotzdem - die Variable wurde erst nach dem Laden der Seite aus der API abgerufen, also musste ich das auf andere Weise lösen. Ich gebe Ihnen Anerkennung, weil Ihre Antwort die richtige Antwort auf meine Frage ist. Vielen Dank! :) – timgavin

Verwandte Themen