2016-04-09 7 views
2

Ich versuche ein Objekt zu erstellen, das als persistenter Zustand meiner App dienen wird. Das bedeutet, dass nach dem Start der App auf den ersten Zeitpunkt verwiesen wird, an dem das Statusobjekt von AsyncStorage geladen werden muss. Hier ist, was ich bisher habe:Persistenten App-Status mit AsyncStorage instanziieren

Gerade jetzt, das gibt das Versprechen zurück, wenn ich es versuche und es verwende. Gibt es eine Möglichkeit, meinen Objektwert aus dem Versprechen zu extrahieren, oder ein besseres Muster, um das zu erreichen, was ich versuche? Vielleicht muss ich State beim Start einfach initialisieren.

+0

Ich würde tatsächlich den Start zu einem Rückruf/Versprechen auf dem Speicher verschieben, der ausgelöst wird, sobald der Speicher initialisiert wird. Auf diese Weise müssen Sie Haare in der App-Logik nicht teilen. Dazu muss der Startcode in zwei Teile aufgeteilt werden: ohne Status und mit Status ... – dandavis

+0

Wo genau möchten Sie das Objekt aus dem Versprechen extrahieren? Sie geben bereits eine Instanz zurück. Wenn Sie also mit then() folgen, erhalten Sie den Instanzwert. Ein Problem, das ich sehe, ist, dass, wenn die Instanz bereits gesetzt ist, Sie es direkt zurückgeben. Sie sollten immer eine Zusage zurückgeben, damit die Funktion konsistent ist. – carlosdubusm

+0

@dandavis: Ich bin mir nicht sicher, was Sie meinen, könnten Sie ein Beispiel geben? –

Antwort

1

In Ordnung, ich habe eine praktikable Lösung. Im Wesentlichen verzögerte ich die Initialisierung der App, bis der Status über AsyncStorage geladen wurde. Dies ist notwendig, da es der Status ist, der der App mitteilt, ob sie beim Anmeldebildschirm starten soll oder nicht. In meiner Stammdatei:

constructor(props) { 
    super(props); 
    this.state = { 
     stateLoaded: false 
    } 
    State.initialize().then(() => { 
     this.setState({stateLoaded: true}) 
    }) 
    } 

    render() { 
    if (this.state.stateLoaded) { 
     return (
      // Your startup code 
    ); 
    } else { 
     return (
     // Your loading screen code 
    } 
    } 
} 

Und in meiner State-Klasse:

initialize() { 
    if (!this.initialized) { 
     return AsyncStorage.getItem('appState').then(value=>JSON.parse(value)) 
     .then((value) => { 
     if (value) { 
      Object.assign(this, value) 
      console.log("assigning saved state") 
     } else { 
      console.log("assigning fresh state") 
      AsyncStorage.setItem('appState', JSON.stringify(this)) 
     } 
     this.intialized = true 
     return this 
     }) 
    } else { 
     return promise.resolve(this) 
    } 
    } 
} 

Jetzt kann ich Referenz sicher Variablen aus State während meiner app, da Initialisierung, bevor irgendetwas anderes passiert. Soweit ich weiß, ist dies der beste (einzige?) Weg, dies zu tun. Wenn das nicht der Fall ist, lassen Sie es mich wissen, denn das ist ziemlich hässlich.

+0

Sieht gut aus für mich. Folgte diesem Ansatz und arbeitete auch aus. Nicht das schönste, aber einfach und effizient. In meinem Fall habe ich das verwendet, um sicherzustellen, dass ich die bevorzugte Sprache geladen habe. –

Verwandte Themen