Javascript 如何使用asyncStorage从本地存储获取值并返回它
我想创建一个方法,从本地存储中存储的令牌返回一个auth头,这样就可以从许多ajax调用它,如下所示:Javascript 如何使用asyncStorage从本地存储获取值并返回它,javascript,react-native,asynchronous,asyncstorage,Javascript,React Native,Asynchronous,Asyncstorage,我想创建一个方法,从本地存储中存储的令牌返回一个auth头,这样就可以从许多ajax调用它,如下所示: const fetchUserInfo = (username) => { const requestString = apiBaseURL + 'access/user_info/' const form = {username: username} return axios.post(requestString, form, getAuthHeader()) .
const fetchUserInfo = (username) => {
const requestString = apiBaseURL + 'access/user_info/'
const form = {username: username}
return axios.post(requestString, form, getAuthHeader())
.then((Response) => {
return {
userInfo: Response.data,
message: null
}
})
.catch((Error) => {
return getErrorMessage();
});
}
在这种情况下,getAuthHeader()
是一种必须从本地存储中存储的令牌返回正确授权头的方法,因此它必须使用asyncStorage
来检索该令牌
这是getAuthHeader
的代码:
export const getAuthHeader = async () => {
return await AsyncStorage.getItem('token')
.then ((token) => {
return {
headers: {'Authorization' : 'Token ' + token}
}
})
.catch ((error) => null)
}
问题是
getAuthHeader()
返回的不是头,而是其他对象。我相信我弄乱了异步存储的异步特性,但我不知道如何获得所需的值。是的,您正在使用异步/wait
和。然后一起使用(本机)async/await
已经处理了。然后
就可以为您处理语法,而无需您这么做。所以你不需要两者同时存在,要么是1,要么是另一个。下面两个例子
异步/等待:
export const getAuthHeader = async () => {
try {
const token = await AsyncStorage.getItem('token')
if (!token) { return null }
return {
headers: {'Authorization' : 'Token ' + token}
}
} catch(error) { return null }
}
土生土长的
export const getAuthHeader = () => {
return AsyncStorage.getItem('token')
.then((token) => {
if (!token) { return null }
return {
headers: {'Authorization' : 'Token ' + token}
}
})
.catch ((error) => null)
}
您还需要在第一个方法中等待getAuthHeader
,否则它将永远无法解析该值:
const fetchUserInfo = async (username) => {
const requestString = apiBaseURL + 'access/user_info/'
const form = {username: username}
try {
const response = await axios.post(requestString, form, await getAuthHeader())
return {
userInfo: response.data,
message: null
}
} catch(error) {
return getErrorMessage();
}
}
它不起作用。我可以看到AsyncStorage
检索正确的值,但是在调用方法中,getAuthHeader
接收的不是头,而是另一个对象。我怀疑这是一个承诺,但我不知道如何找到它,如果是的话,如何解决它。答案编辑@huluvigate问题是,那么,fetchUserInfo()
将成为一个承诺,调用它的方法也需要成为async
,这是不可能的。要做你想做的事情,它必须成为一个承诺。除非您不使用异步存储。如果我需要一个持久本地存储,我可以用什么来代替呢?.catch((error)=>null)
。这样的代码会把你带进一个兔子洞,你可能永远也回不来了。