使用AsyncStorage实例化持久性应用程序状态

时间:2016-04-09 21:54:32

标签: javascript node.js react-native

我正在尝试创建一个将作为我的应用程序持久状态的对象。这意味着在应用程序启动后第一次引用状态时,它需要从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。

1 个答案:

答案 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中的变量,因为初始化发生在其他任何事情之前。据我所知,这是最好的(只有?)方式。如果情况并非如此,请告诉我,因为这非常难看。