我正在尝试创建一个将作为我的应用程序持久状态的对象。这意味着在应用程序启动后第一次引用状态时,它需要从AsyncStorage加载状态对象。这是我到目前为止所得到的:
var instance = null;
var State = {
user: "bob",
update(newState) {
Object.assign(instance, newState);
AsyncStorage.setItem('appState', JSON.stringify(instance)).then(() => {
AsyncStorage.getItem('appState', (err, result) => {
console.log(result)
})
})
}
}
module.exports = (() => {
if (!instance) {
return AsyncStorage.getItem('appState').then((value) => {
if (value) {
instance = value
console.log("assigning saved state")
} else {
instance = State
console.log("assigning fresh state")
AsyncStorage.setItem('appState', JSON.stringify(instance))
}
return instance
})
} else {
console.log("using existing state")
return instance
}
})();
现在,当我尝试使用它时,这会返回承诺。有没有办法从promise中提取我的对象值,或者更好的模式来完成我想要做的事情?也许我必须在启动时初始化State。
答案 0 :(得分:1)
好吧,我有一个可行的解决方案。本质上,我延迟了应用程序的初始化,直到通过AsyncStorage加载状态。这是必要的,因为它是告诉应用程序是否在登录屏幕启动的状态。在我的根文件中:
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
}
}
}
在我的国家班上:
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)
}
}
}
现在,我可以在我的应用程序中安全地引用State
中的变量,因为初始化发生在其他任何事情之前。据我所知,这是最好的(只有?)方式。如果情况并非如此,请告诉我,因为这非常难看。