React native 从React Native中的异步存储中获取项

React native 从React Native中的异步存储中获取项,react-native,asyncstorage,React Native,Asyncstorage,我有一份中国公司的名单 当我点击其中一家公司时,我会得到用于所选公司的API的url。然后将其存储到AsyncStorage,然后显示登录屏幕。功能如下: selectCompany(data_url, e) { AsyncStorage.setItem("data_url", JSON.stringify(data_url), () => this.props.login()); } onLogin: function() { fetch(data.url + '/ma

我有一份中国公司的名单

当我点击其中一家公司时,我会得到用于所选公司的API的url。然后将其存储到
AsyncStorage
,然后显示登录屏幕。功能如下:

selectCompany(data_url, e) {
    AsyncStorage.setItem("data_url", JSON.stringify(data_url), () => this.props.login());
}
onLogin: function() {  
  fetch(data.url + '/manager/api/v1/obtain-auth-token/', })
    .then(function(body) {
    return body.json();
  }).then(function(json) {
    .....
  }).catch(function() {
    ....
  });
},
let data_url = AsyncStorage.getItem("data_url").then(json => JSON.parse(json));
module.exports = {

    url: data_url,
    .....
}
然后,在登录页面上,如果我点击
登录
按钮,我将进入
在线登录
功能,该功能如下:

selectCompany(data_url, e) {
    AsyncStorage.setItem("data_url", JSON.stringify(data_url), () => this.props.login());
}
onLogin: function() {  
  fetch(data.url + '/manager/api/v1/obtain-auth-token/', })
    .then(function(body) {
    return body.json();
  }).then(function(json) {
    .....
  }).catch(function() {
    ....
  });
},
let data_url = AsyncStorage.getItem("data_url").then(json => JSON.parse(json));
module.exports = {

    url: data_url,
    .....
}
data.url
来自
data.js
文件,我尝试从data.js文件中获取
url
,如下所示:

selectCompany(data_url, e) {
    AsyncStorage.setItem("data_url", JSON.stringify(data_url), () => this.props.login());
}
onLogin: function() {  
  fetch(data.url + '/manager/api/v1/obtain-auth-token/', })
    .then(function(body) {
    return body.json();
  }).then(function(json) {
    .....
  }).catch(function() {
    ....
  });
},
let data_url = AsyncStorage.getItem("data_url").then(json => JSON.parse(json));
module.exports = {

    url: data_url,
    .....
}

但它不起作用。有什么建议吗?

异步存储是异步的,因此在检索数据之前不会定义数据url,您需要将获取移动到从获取返回的承诺中,以便在获取数据后运行它。这可能是解决问题的一种方法:

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() {
    ....
    });
  });
},

AsyncStorage.getItem是一个承诺,需要等待响应而不是直接访问,调用它的函数应定义为async。下面是一个从异步存储检索的示例

export async function getAccessKey(){
 let accessToken =  await AsyncStorage.getItem(ACCESS_TOKEN);
 return accessToken;
}