2017-05-12 8 views
0

私はReact Nativeの企業一覧を持っています。AsyncStorage from React Nativeからの商品を取得

これらの企業の1つをクリックすると、選択した会社に使用されているAPIのURLが取得されます。それから私はAsyncStorageにそれを保存し、私はログイン画面を表示します。次のように関数は次のとおりです。

selectCompany(data_url, e) { 
    AsyncStorage.setItem("data_url", JSON.stringify(data_url),() => this.props.login()); 
} 

そして、ログインページに、私はonLogin機能に行くsign inボタンをクリックすると、以下のように、関数は次のとおりです。

onLogin: function() { 
    fetch(data.url + '/manager/api/v1/obtain-auth-token/', }) 
    .then(function(body) { 
    return body.json(); 
    }).then(function(json) { 
    ..... 
    }).catch(function() { 
    .... 
    }); 
}, 

そしてdata.urlが​​ファイルから来て、

let data_url = AsyncStorage.getItem("data_url").then(json => JSON.parse(json)); 
module.exports = { 

    url: data_url, 
    ..... 
} 

しかし、それはありません:と私は次のようにdata.jsファイルから urlを取得しよう動作しません。何かアドバイス?

答えて

1

AsyncStorageは非同期です。したがって、data_urlは、それが探しているものが検索されるまで定義されません。フェッチをgetから返された約束に移動して、データを取得したら実行します。あなたのコンポーネントの内部になりまし

const data_url =() => AsyncStorage.getItem("data_url"); //change this into a function 
module.exports = { 

    url: data_url, 
    ..... 
} 

...

onLogin: function() { 
    data.url().then((url) => { 
    fetch(JSON.parse(url) + '/manager/api/v1/obtain-auth-token/', }) 
    .then(function(body) { 
     return body.json(); 
    }).then(function(json) { 
    ..... 
    }).catch(function() { 
    .... 
    }); 
    }); 
}, 
0

AsyncStorage.getItemが約束され、むしろ直接的および関数呼び出しにアクセスするよりも、応答を待つ必要があります。これは、あなたがそれに取り組む一つの方法かもしれません非同期として定義する必要があります。 AsyncStorageから取得する例を次に示します。

export async function getAccessKey(){ 
let accessToken = await AsyncStorage.getItem(ACCESS_TOKEN); 
return accessToken; 
} 
関連する問題