2017-12-11 14 views
1

私は非同期ストレージから値を取得し、それをStateに割り当てようとしています。 URL状態が未定義に戻る - 元のネイティブ

constructor(props) { 
    super(props); 
    this.state = { 
     stAccntList: [], 
     stUserAccountNo: '', 
     stCustNo: '', 
     resp: '', 
    }; 
    AsyncStorage.getItem('UserAccountNo').then((value) => { 
     if (value != '') { 
      accno = value; 
      this.setState({ stUserAccountNo: value }); 
      // alert(this.state.stUserAccountNo); 
     } 
    }).done(); 
    AsyncStorage.getItem('CustomerNo').then((value) => { 

     if (value != '') { 
      cusno = value; 
      this.setState({ stCustNo: value }); 
      // alert(this.state.stUserAccountNo); 

     } 
    }).done(); 


} 


    componentWillMount() { 

     let restUrl = urls.URL + this.state.stCustNo + "/" + "accounts" + "/" + this.state.stUserAccountNo; 

} 

に教え込むアクセスしながら状態の 値がnull /未定義に来ているthis.state.CustNoとthis.state.stUserAccountNoはnullを返しています。

どこが間違っているか教えてください。

+1

async-awaitを利用することができ、そのcomponentWillMountが実行される前に、データが利用可能であることをguranteedありません。 –

+0

これを達成する方法は? –

+1

restUrlの目的がcomponentWillMountにあるかどうかによって異なります。 –

答えて

2

データを非同期にフェッチして状態を更新しようとしているため、コンポーネントのWillMountが実行される前にデータが利用可能であるとは限りません。あなたは非同期でデータを取得しようとすると、状態を更新しているので

あなたが代わりにcomponentDidMountに

constructor(props) { 
    super(props); 
    this.state = { 
     stAccntList: [], 
     stUserAccountNo: '', 
     stCustNo: '', 
     resp: '', 
    }; 

} 

async componentDidMount() { 
    var userAccountNo = await AsyncStorage.getItem('UserAccountNo'); 
    var CustomerNo = await AsyncStorage.getItem('CustomerNo'); 
    if (userAccountNo != '') { 
     this.setState({ stUserAccountNo: userAccountNo }); 
    } 
    if (CustomerNo != '') { 
     this.setState({ stCustNo: CustomerNo }); 
    } 
    if(userAccountNo !== '' && CustomerNo !== '') { 
    var restUrl = urls.URL + this.state.stCustNo + "/" + "accounts" + "/" + this.state.stUserAccountNo; 
    } 
} 
+0

私はあなたを確認し、更新します。 –

0

restURLはすぐに使用されるか、後で使用されますか(つまり、クリックイベントなどの後のイベント)?すぐに使用する場合は、またはasync awaitを使用して、AsyncStorageの両方が完了したときにrestURLを使用する前に追跡することをお勧めします。後でURLを使用している場合は、使用する前に完全に頼りにしておくか、使用する前に確認する必要があります。

+0

すぐにcomponentWillMountのrestUrlの下で使用します –

+0

次に約束を見て、非同期待ってください。両方のAsyncStorageがデータを保持していることを知るためには、両方のAsyncStorageが完了したことを知っておく必要があります( 'then()')。 –

関連する問題