2016-04-09 12 views
2

私のアプリケーションの永続状態として機能するオブジェクトを作成しようとしています。これは、アプリケーションの起動後に初めて状態が参照されることを意味し、AsyncStorageから状態オブジェクトをロードする必要があります。これまでのところ私はこれまで何を得ているのですか: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 
    } 
})(); 

これは私が試してみると約束しています。約束からオブジェクト価値を引き出す方法はありますか、それとも私がやろうとしていることを達成するためのよりよいパターンですか?おそらく、起動時にStateを初期化する必要があります。

+0

実際には、ストアが初期化されると起動するストレージのコールバック/約束にスタートアップを移動します。そうすれば、アプリロジックでヘアを分割する必要はありません。起動コードを2つの部分に分割する必要があります:状態なしと状態付き... – dandavis

+0

正確に約束からオブジェクトを抽出したいですか?あなたはすでに 'インスタンス'を返しています。したがって、then()を実行すると、インスタンス値が取得されます。私が見ている問題は、インスタンスが既に設定されている場合、それを直接返すことです。関数が一貫しているように、常に約束を返すべきです。 – carlosdubusm

+0

@dandavis:あなたは何を意味するのか分かりません。 –

答えて

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から変数を参照することができます。私が知る限り、これはこれを行うための最良の(唯一の)方法です。そうでない場合は、私に知らせてください、これはかなり醜いです。

+0

私によく見えます。このアプローチに従い、また取り組んだ。一番美しいのではなく、シンプルで効率的です。私の場合は、これを使用して、優先言語をロードするようにしました。 –

関連する問題