ReactJS - 在函数中获取
ReactJS - Fetching Within a Function
我有一个函数需要提交一个 API 请求,等待响应并且 return 响应的状态是否在 200-299 范围内(即 response.isOk attribute
).
但是,当我从一个组件调用该函数时,我假设我得到的响应太迟了(该函数不等待提取完成而是 returns undefined
) .有解决办法吗?
AuthFunctions.js
export function validateToken(token) {
const requestOptions = {
method: "GET",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + token,
},
};
return fetch("/api/validateToken", requestOptions).then(
(response) => response.ok
);
}
App.js
function App() {
return (
<BrowserRouter>
<div className="App">
{!token ||
(token === "" && token === undefined) ||
!validateToken(token) ? (
<AuthPage setToken={setToken} />
) : (
<>
<Routes>
<Route
exact
path="/dashboard"
element={<Dashboard token={token} />}
></Route>
</Routes>
</>
)}
</div>
</BrowserRouter>
);
}
您需要通过添加 async 关键字将 validateToken 函数设置为异步函数:
(这也不是强制性的,因为您没有像评论中指出的那样使用 await)。
export async function validateToken(token) {
const requestOptions = {
method: 'GET',
headers: {
'Content-Type': 'application/json',
Authorization: 'Bearer ' + token,
},
};
const response = await fetch('/api/validateToken', requestOptions);
return response.ok;
}
你可以在state里保存token验证状态,第一次渲染的时候用effect给你打电话api
我添加了 hasFetched 状态以避免在等待 api 响应时显示身份验证页面以获得更好的用户体验。我只 return 一个加载段落,但你想要什么 return 由你决定。
function App() {
const [hasFetched, setHasFetched] = useState(false);
const [isTokenValid, setIsTokenValid] = useState(false)
useEffect(()=>{
validateToken(token).then((response)=>{
setIsTokenValid(response);
setHasFetched(true);
}).catch((error)=>{
console.log(error)
setHasFetched(true);
})
},[])
if (!hasFetched) return <p>Loading</p>;
return (
<BrowserRouter>
<div className="App">
{!token ||
(token === "" && token === undefined) ||
!isTokenValid ? (
<AuthPage setToken={setToken} />
) : (
<>
<Routes>
<Route
exact
path="/dashboard"
element={<Dashboard token={token} />}
></Route>
</Routes>
</>
)}
</div>
</BrowserRouter>
);
}
你从哪里得到令牌?
无论如何,您可以做两件主要的事情:
- 使用使用状态创建一个 isTokenValid 布尔值:
[isTokenValid, setIsTokenValid] = useState(false):
- 创建一个 useEffectHook,一旦应用程序组件呈现/令牌发生变化,它就会执行验证
useEffect(async ()=> {
if(!!token) {
const isValid = await validateToken(token);
setIsTokenValid(isValid);
};
}, [token]);
希望对你有帮助^^
我有一个函数需要提交一个 API 请求,等待响应并且 return 响应的状态是否在 200-299 范围内(即 response.isOk attribute
).
但是,当我从一个组件调用该函数时,我假设我得到的响应太迟了(该函数不等待提取完成而是 returns undefined
) .有解决办法吗?
AuthFunctions.js
export function validateToken(token) {
const requestOptions = {
method: "GET",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + token,
},
};
return fetch("/api/validateToken", requestOptions).then(
(response) => response.ok
);
}
App.js
function App() {
return (
<BrowserRouter>
<div className="App">
{!token ||
(token === "" && token === undefined) ||
!validateToken(token) ? (
<AuthPage setToken={setToken} />
) : (
<>
<Routes>
<Route
exact
path="/dashboard"
element={<Dashboard token={token} />}
></Route>
</Routes>
</>
)}
</div>
</BrowserRouter>
);
}
您需要通过添加 async 关键字将 validateToken 函数设置为异步函数:
(这也不是强制性的,因为您没有像评论中指出的那样使用 await)。
export async function validateToken(token) {
const requestOptions = {
method: 'GET',
headers: {
'Content-Type': 'application/json',
Authorization: 'Bearer ' + token,
},
};
const response = await fetch('/api/validateToken', requestOptions);
return response.ok;
}
你可以在state里保存token验证状态,第一次渲染的时候用effect给你打电话api
我添加了 hasFetched 状态以避免在等待 api 响应时显示身份验证页面以获得更好的用户体验。我只 return 一个加载段落,但你想要什么 return 由你决定。
function App() {
const [hasFetched, setHasFetched] = useState(false);
const [isTokenValid, setIsTokenValid] = useState(false)
useEffect(()=>{
validateToken(token).then((response)=>{
setIsTokenValid(response);
setHasFetched(true);
}).catch((error)=>{
console.log(error)
setHasFetched(true);
})
},[])
if (!hasFetched) return <p>Loading</p>;
return (
<BrowserRouter>
<div className="App">
{!token ||
(token === "" && token === undefined) ||
!isTokenValid ? (
<AuthPage setToken={setToken} />
) : (
<>
<Routes>
<Route
exact
path="/dashboard"
element={<Dashboard token={token} />}
></Route>
</Routes>
</>
)}
</div>
</BrowserRouter>
);
}
你从哪里得到令牌?
无论如何,您可以做两件主要的事情:
- 使用使用状态创建一个 isTokenValid 布尔值:
[isTokenValid, setIsTokenValid] = useState(false):
- 创建一个 useEffectHook,一旦应用程序组件呈现/令牌发生变化,它就会执行验证
useEffect(async ()=> {
if(!!token) {
const isValid = await validateToken(token);
setIsTokenValid(isValid);
};
}, [token]);
希望对你有帮助^^