1

我有一份 React Native 公司的名单。

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

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

然后在登录页面上,如果我点击sign in按钮,我会转到该onLogin功能,功能如下:

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

并且data.url来自data.js文件,我尝试url从data.js文件中获取如下:

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

    url: data_url,
    .....
}

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

4

2 回答 2

1

AsyncStorage 是异步的,因此在检索到它要查找的内容之前不会定义 data_url,您需要将 fetch 移动到从 get 返回的 promise 中,以便在完成获取数据后运行它。这可能是您解决它的一种方法:

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() {
    ....
    });
  });
},
于 2017-05-12T16:35:35.747 回答
0

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

export async function getAccessKey(){
 let accessToken =  await AsyncStorage.getItem(ACCESS_TOKEN);
 return accessToken;
}
于 2017-05-13T04:18:04.490 回答