reactjs - React Native(Expo) SecureStore getItemAsync
问题描述
我正在使用“expo-secure-store”来存储 JWT 令牌。当我尝试首先获取数据时,它什么都不返回,然后是令牌。
我的代码:
const [api, ApiReply] = React.useState("");
const [isLoading, setLoading] = useState(true);
const [token, setToken] = React.useState("");
const clickHandler = () => {
SecureStore.getItemAsync("secure_token").then((token) => setToken(token));
console.log(token);
var myHeaders = new Headers();
myHeaders.append("Authorization", "Bearer " + token);
var requestOptions = {
method: "GET",
headers: myHeaders,
};
fetch("http://193.119.10.206:3000/auth/user/8", requestOptions)
.then((response) => response.text())
.then((result) => ApiReply(JSON.parse(result)))
.catch((d) => {
alert("500");
})
.finally(() => setLoading(false));
};
React.useEffect(() => {
clickHandler();
}, [api])
渲染时我需要令牌。有什么解决方案或替代方法吗?
解决方案
您可以通过三种方式执行此操作:
将所有东西移到
then
封闭内。这将等待您的 get async 函数完成,然后再对令牌执行任何操作。const clickHandler = () => { SecureStore.getItemAsync("secure_token").then((token) => { setToken(token); console.log(token); var myHeaders = new Headers(); myHeaders.append("Authorization", "Bearer " + token); var requestOptions = { method: "GET", headers: myHeaders, }; fetch("http://193.119.10.206:3000/auth/user/8", requestOptions) .then((response) => response.text()) .then((result) => ApiReply(JSON.parse(result))) .catch((d) => { alert("500"); }) .finally(() => setLoading(false)); }); };
改用
await
:const clickHandler = async () => { const token = SecureStore.getItemAsync("secure_token"); setToken(token); console.log(token); var myHeaders = new Headers(); myHeaders.append("Authorization", "Bearer " + token); var requestOptions = { method: "GET", headers: myHeaders, }; fetch("http://193.119.10.206:3000/auth/user/8", requestOptions) .then((response) => response.text()) .then((result) => ApiReply(JSON.parse(result))) .catch((d) => { alert("500"); }) .finally(() => setLoading(false));
};
利用 useEffect:
const clickHandler = ()=>{ SecureStore.getItemAsync("secure_token").then((token) => setToken(token)); }
useEffect(()=>{ if(token !== null) { //call fetch } },[token])
推荐阅读
- javascript - 如何获取特定不和谐频道的最后一条消息
- python - Python:删除列表列表中的重复列表
- c# - LINQ 查询上的可选过滤器返回意外结果
- javascript - 如果在数字之间用 javascript 替换逗号
- c - 为什么可以将 sa_family,一个无符号整数,一个由 socket.h 定义的结构与 AF_INET 进行比较
- ios - 如何检查给定数组中哪些项目已保存在 Core Data 中
- reactjs - 如何隐藏 devextreme react 网格中不包含任何数据的行的列?
- android - 如何使用 Google 的 GithubBrowserSample 方法在片段之间共享视图模型?
- maven - maven-assembly-plugin 无法将 unirest-java 作为依赖项
- node.js - Electron app.on('ready'... 永远不会被调用,也永远不会显示电子窗口。似乎与特定的 Git 存储库相关联