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.
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
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
@dandavis: Ich bin mir nicht sicher, was Sie meinen, könnten Sie ein Beispiel geben? –