🌿 Comprendre JS
Les fonctions
Async/await

Titre : Démystification d'Async et Await en JavaScript : Un Guide pour les Jeunes Développeurs

Dans cet article, nous allons plonger dans les rouages de la programmation asynchrone et fournir un guide complet sur la manière dont async et await fonctionnent en JavaScript.

La Nécessité de la Programmation Asynchrone

Avant d'entrer dans les détails de async et await, discutons brièvement de pourquoi la programmation asynchrone est importante. En développement web, JavaScript doit souvent effectuer des tâches qui prennent du temps pour se terminer, comme faire des requêtes réseau, lire des fichiers ou attendre une saisie utilisateur. Si ces tâches étaient exécutées de manière synchrone, elles bloqueraient l'ensemble de l'application jusqu'à leur achèvement, ce qui entraînerait une mauvaise expérience utilisateur.

La programmation asynchrone permet à JavaScript de gérer plusieurs tâches en même temps, garantissant que l'application reste réactive et continue de traiter d'autres tâches tout en attendant que certaines opérations se terminent. C'est là que async et await entrent en jeu.

Comprendre async et await

Le Mot-Clé async

Le mot-clé async est utilisé pour définir une fonction comme asynchrone. Une fonction asynchrone renvoie un type spécial d'objet appelé une Promesse (Promise). Une Promesse représente une valeur qui peut être disponible maintenant, dans le futur, ou jamais ! Elle porte bien son nom : il s'agit d'une promesse de résultat retourné par la fonction. Et les promesses n'engagent que ceux qui les croient :)

En marquant une fonction comme async, vous indiquez que cette fonction contiendra des opérations asynchrones ET qu'elle renverra une Promesse.

Le Mot-Clé await

Le mot-clé await est utilisé à l'intérieur d'une fonction asynchrone pour mettre en pause l'exécution de cette fonction jusqu'à ce que la Promesse qu'elle attend soit résolue. Il ne peut être utilisé qu'à l'intérieur d'une fonction async. Lorsque le mot-clé await est rencontré, la fonction se "met en pause" à ce stade, permettant à un autre code de s'exécuter pendant ce temps. Cela est incroyablement utile pour attendre des opérations chronophages telles que les appels d'API.

Exemple : Utilisation de async et await

Prenons un exemple concret pour mieux comprendre comment async et await fonctionnent. Imaginez que vous construisez une application météo qui récupère des données météorologiques à partir d'une API. Voici comment vous pourriez utiliser async et await pour y parvenir :

async function fetchWeather(city) {
  try {
    const apiKey = 'votre_clé_api';
    const response = await fetch(`https://api.weatherapi.com/v1/current.json?key=${apiKey}&q=${city}`); // On reste bloqué ici tant que le fetch n'a pas retourné de valeur
    const data = await response.json(); // On reste bloqué ici tant que la conversion en json n'est pas terminée
    return data;
  } catch (error) {
    throw new Error('Impossible de récupérer les données météorologiques');
  }
}
 
async function displayWeather(city) {
  try {
    const weatherData = await fetchWeather(city); // On reste bloqué ici tant que la fonction fetchWeather n'a pas retourné de résultat
    console.log(`Météo actuelle à ${city} : ${weatherData.current.temp_c}°C`);
  } catch (error) {
    console.error(error.message);
  }
}
 
// Appeler la fonction displayWeather
displayWeather('New York');

Dans cet exemple, la fonction fetchWeather est marquée comme async. Elle effectue une requête API pour récupérer les données météorologiques de la ville spécifiée. Le mot-clé await est utilisé avant les appels fetch et response.json(), garantissant que la fonction attend que la Promesse soit résolue avant de continuer.

La fonction displayWeather utilise également async et await pour s'assurer que les données météorologiques sont récupérées et affichées correctement. Si des erreurs surviennent pendant le processus, elles sont capturées dans le bloc catch et des messages d'erreur appropriés sont affichés.

Avantages de l'Utilisation de async et await

  • Lisibilité : L'utilisation de async et await rend le code asynchrone plus lisible et plus facile à maintenir, car il ressemble davantage à du code synchrone.

  • Gestion des Erreurs : async et await simplifient la gestion des erreurs en vous permettant d'utiliser des blocs try...catch.

  • Enchaînement : Vous pouvez enchaîner plus facilement plusieurs opérations asynchrones en utilisant await, ce qui rend le flux du code plus intuitif.

A utiliser avec modération

Une erreur de débutant consiste à abuser de ces directives.

Quelques exemples :

  • si votre fonction retourne ne comporte aucun await, pas besoin de la marquer comme async même si elle retourne une Promesse.
  • inutile de préfixer par await une fonction qui ne retourne pas une Promesse. Ex : await neRetournePasUnePromesse() ne sert à rien
  • sauf dans des cas spécifiques, inutile de terminer votre fonction async par un return await uneAutreFonctionAsync(). Vous pouvez simplement utiliser return uneAutreFonctionAsync()

En utilisant ces mots-clés de manière efficace, vous pourrez écrire un code propre, lisible et facile à maintenir tout en gérant des opérations asynchrones en cascade. C'est une solution au problème de (l'enfer des callbacks)[lien]. Alors, saisissez la puissance de async et await alors que vous vous lancez dans votre parcours de programmation !