Réagir Crochet Avertissements pour fonction async dans useEffect: useEffect fonction doit retourner une fonction de nettoyage ou rien
J'ai essayé le useEffect exemple quelque chose comme ci-dessous:
JS:
useEffect(async () => {
try {
const response = await fetch(`https://www.reddit.com/r/${subreddit}.json`);
const json = await response.json();
setPosts(json.data.children.map(it => it.data));
} catch (e) {
console.error(e);
}
}, []);
et je reçois ce message d'avertissement dans ma console. Mais le nettoyage est facultatif pour les appels asynchrones je pense. Je ne sais pas pourquoi j'obtiens ce message d'avertissement. La liaison sandbox pour des exemples. https://codesandbox.io/s/24rj871r0p
Vous devez vous connecter pour publier un commentaire.
Je suggère de regarder Dan Abramov (l'un des réagir créateurs) réponse ici:
useEffect(() => { let unmounted = false promise.then(res => { if (!unmounted) { setState(...) } }) return () => { unmounted = true } }, [])
Lorsque vous utilisez une fonction async comme
elle renvoie une promesse et
useEffect
ne vous attendez pas à la fonction de rappel pour le retour de la Promesse, plutôt il s'attend à ce que rien n'est renvoyé ou une fonction est retournée.Comme une solution de contournement pour l'avertissement, vous pouvez utiliser un auto invocation asynchrone en fonction.
ou pour le rendre plus propre, vous pouvez définir une fonction et ensuite l'appeler
la deuxième solution sera plus facile à lire et à vous aider à écrire du code pour annuler les précédentes demandes si un est tiré ou d'enregistrer la dernière réponse à la requête de l'état
Travail codesandbox
useEffect
vous pouviez retourner une fonction pour faire le nettoyage comme vous désabonner à des événements. Lorsque vous utilisez la fonction async vous ne pouvez pas retourner quoi que ce soit parceuseEffect
ne va pas attendre le résultatJusqu'Réagir fournit une meilleure façon, vous pouvez créer un helper,
useEffectAsync.js
:Maintenant, vous pouvez passer d'une fonction async: