bonjour j'ai cette classe quand j'appelle Auth.isAuthenticated () depuis un autre composant dans react, elle retourne toujours false (c'est la valeur par défaut), même si le serveur renvoie une réponse 200, la sorcière définit this.authenticated = true. comment utiliser les promesses pour faire attendre la méthode jusqu'à ce que l'appel de récupération soit terminé, puis renvoyer le résultat
Modifier: J'ai besoin que le booléen true ou false soit retourné, donc en fonction de cela, je peux afficher ou masquer le composant, toutes les réponses sont utiles mais j'ai besoin d'un booléen pas une promesse d'aide s'il vous plaît
export const PrivateRoute = ({ component: Component, ...rest }) => {
return (
<Route {...rest} render={(props) => (
Auth.isAuthenticated() === true
? <Component {...props} />
: <Redirect to='/admin' />
)} />
)
}
et à partir d'un autre composant, j'appelle Auth.isAuthenticated () === true
class Auth {
constructor() {
this.authenticated = false;
}
isAuthenticated() {
//get token from local storage if there is one
const jwttoken = localStorage.getItem('jwttoken');
const bearer = 'Bearer ' + jwttoken;
const data = new FormData();
// get the website backend main url from .env
const REACT_APP_URL = process.env.REACT_APP_URL
fetch(`${REACT_APP_URL}/api/auth/verify`, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Authorization': bearer,
},
body: data
}).then(
(response) => {
response.json()
.then((res) => {
if (response.status === 200) {
this.authenticated = true;
}
if (response.status === 401) {
localStorage.removeItem('jwttoken');
this.authenticated = false;
}
})
}
).catch((err) => {
// console.log(err)
});
return this.authenticated;
}
}
export default new Auth();
3 Réponses :
utilisez await async
async isAuthenticated() {
//get token from local storage if there is one
const jwttoken = localStorage.getItem('jwttoken');
const bearer = 'Bearer ' + jwttoken;
const data = new FormData();
// get the website backend main url from .env
const REACT_APP_URL = process.env.REACT_APP_URL
const response = await fetch(`${REACT_APP_URL}/api/auth/verify`, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Authorization': bearer,
},
body: data
});
const responseToJson = await response.json();
if (responseToJson.status === 200) {
this.authenticated = true;
}
if (responseToJson.status === 401) {
localStorage.removeItem('jwttoken');
this.authenticated = false;
}
return this.authenticated;
}
@Alexander merci, mais je reçois une promesse mais j'ai besoin d'un booléen
@Rida I mon cas, vous devriez obtenir un booléen, pas une promesse
@AlexandrZavalii il renverra toujours une promesse
Si vous ne voulez pas faire async / wait , vous pouvez demander à isAuthenticated de renvoyer une promesse.
isAuthenticated() {
return new Promise((resolve, reject) => {
//get token from local storage if there is one
const jwttoken = localStorage.getItem('jwttoken');
const bearer = 'Bearer ' + jwttoken;
const data = new FormData();
// get the website backend main url from .env
const REACT_APP_URL = process.env.REACT_APP_URL
fetch(`${REACT_APP_URL}/api/auth/verify`, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Authorization': bearer,
},
body: data
}).then(
(response) => {
response.json()
.then((res) => {
if (response.status === 200) {
resolve(true)
}
if (response.status === 401) {
localStorage.removeItem('jwttoken');
resolve(false)
}
})
}
).catch((err) => {
// reject(err)
});
})
}
Et dans un fonction async que vous pouvez faire let isAuthenticated = attendre isAuthenticated () ou vous pouvez utiliser .then et .catch en dehors de la fonction async pour renvoyer le résultat
Supposons que vous souhaitiez écrire une fonction qui renvoie une promesse et se résout à la fin d'une action (un appel API par exemple). Vous pourriez écrire quelque chose comme ceci:
const sideEffects = async () =>{
const result = await myAsyncFunction()
console.log(result) //'data'
}
Et voilà! Vous avez maintenant une fonction qui renvoie une promesse qui se résoudra en 400 ms. Vous devez maintenant utiliser la méthode .then () ou les instructions async await .
const myAsyncFunction = () =>{
return new Promise((resolve, reject) =>{
//Faking an API Call
setTimeout(() => resolve('data'), 400)
})
}