#reactjs #asynchronous #redux #amazon-cognito #refresh
Вопрос:
Я использую congnito для аутентификации И пытаюсь создать частный маршрут.
В настоящее время я использую redux и amazon-cognito-identity-js
export const cognitoSignIn = async ({
email,
password,
}: SignInInfo): Promise<CognitoUserSession> => {
return new Promise((resolve, reject) => {
console.log(email, password);
const authenticationDetails = new AuthenticationDetails({
Username: email.trim(),
Password: password.trim(),
});
const cognitoUser = new CognitoUser({
Username: email,
Pool: userPool,
});
cognitoUser.authenticateUser(authenticationDetails, {
onSuccess: (result) => {
if (!currentUser) {
currentUser = userPool.getCurrentUser();
}
currentUser.getSession((err: any, session: CognitoUserSession) => {
if (err) {
reject(err);
} else {
resolve(session);
}
});
},
onFailure: reject,
});
});
};
export const signIn =
(signinInfo: SignInInfo) =>
async (dispatch: Dispatch<UpdateToken | UpdateError>) => {
try {
const auth: CognitoUserSession = await cognitoSignIn(signinInfo);
const accessToken = auth.getAccessToken().getJwtToken();
localStorage.setItem("user", JSON.stringify(accessToken));
dispatch(updateToken(accessToken));
} catch (error: any) {
dispatch(updateError(error));
}
};
Мой вопрос не имеет ничего общего с приведенным выше кодом.
Когда вы подписываете cognito, в localstorage создается токен.
при обновлении, чтобы получить состояние токена в localstorage, вам нужно использовать функцию cognito getSession.
Но функция getSession является асинхронной функцией
Как я могу получить данные, выполнив функцию до ее отображения?
Ответ №1:
Мое предложение состоит в том, чтобы использовать «состояние загрузки», которое отображается до тех пор, пока вы ждете свою асинхронную функцию.
Напр.:
const example = () => {
useState[isLoading, setIsLoading] = useState(false)
useEffect(() => {
const asyncFunction = async() => {
setIsLoading(true)
await(something...)
setIsloading(false)
}
asyncFuntion()
}, [])
if(isLoading) return (e.g LoadingSpinner)
return (your component)
}