javascript - 在渲染反应路由之前等待异步函数的结果
问题描述
我正在尝试在路由文件中使用 React 在我的 SPA 中实现身份验证服务。当用户尝试访问某个私有路径时,该函数应验证机器内的令牌是否有效。但是我在这个逻辑中遇到了一个问题,该函数将错误值传递给私有路由。
我的路线文件:
const Routes = () => {
var [authedIn, setAuthedIn] = useState(false);
var authedNow = useRef(authedIn);
const verifyLog = async () => {
if (await AuthUser().then(res => res).catch(res => res) === true) {
setAuthedIn = true;
authedNow.current = true;
console.log('log in');
console.log(authedNow.current);
return true;
}
else {
setAuthedIn = false;
authedNow.current = false;
console.log('log of');
return false;
}
}
useEffect(() => {
verifyLog()
}, [authedNow.current]);
console.log(authedNow.current);
return (
<BrowserRouter>
<Switch>
<Route exact path="/" component={HomeScreen} />
<Route exact path="/register" component={RegisterScreen} />
<Route exact path="/login" component={LoginScreen}/>
<PrivateRouter exact path="/notes" component={NotesScreen} isAuth={authedNow.current}/>
<PrivateRouter exact path="/users/edit" component={UsersEditScreen} isAuth={authedNow.current}/>
</Switch>
</BrowserRouter>
)};
export default Routes;
验证用户文件:
const AuthUser = async () => {
const response = await AuthService.verifyToken();
if (response.status === 200) {
return true;
} else {
localStorage.clear();
return false;
}
}
有没有办法在async
函数的结果之后渲染?
解决方案
要在异步功能完成后重新渲染,您需要更新状态。我对使用 refs 不是很了解,但是您setAuthedIn
错误地使用了该功能。您需要使用参数调用它,而不是将其设置为布尔值。
尝试将您的verifyLog
功能更改为如下所示:
const verifyLog = async () => {
if (await AuthUser().then(res => res).catch(res => res) === true) {
setAuthedIn(true); // <- call the setter function to update authedIn state
return true;
}
else {
setAuthedIn(false);
return false;
}
}
推荐阅读
- redis - 如何从 Redis 获取所有 LFU(最不常用)密钥?
- r - R:“x”值相同,而 lambda 值在 boxcoxnc 函数中的重新划分太重
- ruby-on-rails - Rails:使用 Rails 和 HTTParty 将 JSON 发布到 API
- java - 将 JSON 数据传递到另一个活动并访问新活动中 JSON 数组(和位置)的某些部分
- javascript - 使用 onclick 动态创建元素只执行最后一个元素
- angularjs - AngularJS 问题:$sce:insecurl 尽管 $sce.trustAsResourceUrl
- python - Jupyter notebook 在浏览器中显示空白页
- sql - 确定 2 个表应该使用哪些键来加入 SQL Server
- javascript - 使用 JavaScript 延迟一段时间后功能会起作用吗?
- php - 使用 IF 在 PHP 中一次检查多个变量