Il va sans dire que le hook useEffect est très pratique car il permet de déclencher des actions en fonction de changement d'état ou de props, cependant par défaut il n'est pas possible du d'utiliser facilement du code asynchrone à l'aide de la syntaxe async/await.
À première vu on pourrait être tenté de faire quelque chose de la sorte pour récupérer le contenu d'une API distante.
🤔 Qu'est-ce qui ne va pas avec ce morceau de code ?
Si on utilise Typescript, le compilateur doit nous sortir une erreur de la sorte :
Argument of type '() => Promise<void>' is not assignable to parameter of type 'EffectCallback'.
Regardons la signification de cette erreur en lisant la définition d'une fonction asynchrone :
Ok… Ça me semble bien mais… voyons la suite…
Ouch! Vous commencez à voir le problème ? Non ? Allons voir la définition du hook useEffect ici :
📌 Utiliser une async fonction fait retourner à la fonction de retour une Promesse au lieu d'une fonction de nettoyage.
Et c'est la raison pour laquelle le compilateur nous crie dessus en Typescript. Ce pattern est également vrai pour du Javascript sans Typescript car React n'attends pas une Promesse mais une fonction.
En utilisant la technique suivante, nous serons capables d'utiliser la fonction asynchrone dans nos effets :
Maintenant, votre code est sécurisé car vous ne renvoyez rien du tout et le compilateur a cessé de crier.
Vous pouvez également utiliser un IIFE, qui a le même effet que ci-dessus.