Promesses JavaScript
Se connecter pour s'inscrireVotre progression
Syllabus
-
-
Objectifs
-
Validations de compétences
-
Public cible
Aucun public cible spécifié pour ce module.
-
Besoins techniques
-
Prérequis
- Aucun prérequis
-
Niveau
-
Historique du module
Aucune action enregistrée
Utilisations des Promesses en JavaScript
-
Comprendre le Concept de Promesses
Une promesse représente une valeur qui peut être disponible immédiatement, dans le futur ou jamais. Elle peut être dans l'un des trois états suivants :
- Pending (en attente) : L'état initial d'une promesse, avant qu'elle ne soit résolue ou rejetée.
- Fulfilled (accomplie) : L'état dans lequel une promesse est résolue avec une valeur.
- Rejected (rejetée) : L'état dans lequel une promesse est rejetée avec une raison (une erreur).
-
Utiliser les Promesses pour Gérer l'Asynchronisme
Les promesses sont particulièrement utiles pour gérer les opérations asynchrones, qu'elles soient IO-bound ou CPU-bound. Elles permettent d'attendre la résolution d'une ou plusieurs promesses avant de poursuivre l'exécution du code.
const fetchData = () => { return new Promise((resolve, reject) => { // Effectuer une opération asynchrone, par exemple, une requête HTTP fetch('https://api.example.com/data') .then(response => { if (response.ok) { resolve(response.json()); } else { reject(new Error('Erreur lors de la récupération des données')); } }) .catch(error => { reject(error); }); }); }; // Utilisation de la promesse fetchData() .then(data => { console.log('Données récupérées avec succès :', data); }) .catch(error => { console.error('Erreur lors de la récupération des données :', error); }); -
Maîtriser les Différents États et les Techniques Associées
En plus de comprendre les états des promesses, il est important de maîtriser certaines techniques courantes pour travailler avec les promesses.
-
Promise.all
Cette méthode prend un tableau de promesses en entrée et retourne une nouvelle promesse qui est résolue une fois que toutes les promesses du tableau sont résolues, ou rejetée dès qu'une seule des promesses est rejetée.
Utilisation de async/await
Exemple : Gestion des appels asynchrones de manière synchrone
Supposons que vous ayez une application où vous devez effectuer plusieurs appels asynchrones et traiter les résultats de manière synchrone.
// Fonction pour simuler un appel asynchrone const asyncFunction = (id, delay) => { return new Promise((resolve, reject) => { // Simuler une opération asynchrone avec un délai donné setTimeout(() => { resolve(`Résultat de l'appel asynchrone ${id}`); }, delay); }); }; // Fonction principale asynchrone pour gérer les appels asynchrones de manière synchrone const handleAsyncCalls = async () => { try { // Attendre la résolution de plusieurs appels asynchrones de manière synchrone const result1 = await asyncFunction(1, 2000); // Appel asynchrone 1 avec un délai de 2 secondes console.log(result1); const result2 = await asyncFunction(2, 3000); // Appel asynchrone 2 avec un délai de 3 secondes console.log(result2); const result3 = await asyncFunction(3, 1000); // Appel asynchrone 3 avec un délai de 1 seconde console.log(result3); } catch (error) { console.error('Une erreur s\'est produite :', error); } }; // Appel de la fonction principale asynchrone handleAsyncCalls();Explication
- async/await est une syntaxe pour écrire du code asynchrone de manière synchrone. Les fonctions marquées avec async retournent une promesse, et vous pouvez utiliser l'opérateur await à l'intérieur de ces fonctions pour attendre la résolution de la promesse.
- Dans cet exemple, handleAsyncCalls est une fonction asynchrone qui attend la résolution de plusieurs appels asynchrones à l'aide de l'opérateur await.
Avantages
- Lisibilité : async/await permet d'écrire du code asynchrone de manière synchrone, ce qui le rend plus lisible et plus facile à comprendre.
- Gestion des erreurs : Vous pouvez utiliser try/catch pour gérer les erreurs de manière synchrone, ce qui simplifie la gestion des erreurs dans le code asynchrone.
Limites
- Attente séquentielle : Les appels asynchrones sont toujours exécutés séquentiellement avec await, ce qui peut entraîner une perte de performance si les appels peuvent être exécutés de manière concurrente.
Quand utiliser
Utilisez async/await lorsque vous avez besoin d'écrire du code asynchrone de manière synchrone et que les appels asynchrones doivent être exécutés séquentiellement ou lorsque la gestion des erreurs est importante.
Promise.all, Promise.race et async/await sont des outils puissants pour gérer l'asynchronisme en JavaScript. Promise.all est idéal pour attendre la résolution de plusieurs promesses en parallèle, Promise.race est utile pour réagir rapidement à la première réponse disponible, et async/await est pratique pour écrire du code asynchrone de manière synchrone. Choisissez la technique qui correspond le mieux à vos besoins en fonction de la situation spécifique.
-
Promise.race
Cette méthode prend un tableau de promesses en entrée et retourne une nouvelle promesse qui est résolue ou rejetée dès que l'une des promesses du tableau est résolue ou rejetée, en fonction de celle qui se produit en premier.
Utilisation de Promise.race
Exemple : Affichage de contenu en fonction de la réponse la plus rapide
Supposons que vous ayez une application où vous avez besoin d'afficher du contenu provenant de différentes sources, mais vous voulez afficher le contenu dès qu'une source répond en premier.
// Fonction pour récupérer du contenu à partir d'une source const getContentFromSource = (source, delay) => { return new Promise((resolve, reject) => { // Simuler la récupération de contenu depuis une source avec un délai donné setTimeout(() => { resolve(`Contenu de ${source}`); }, delay); }); }; // URLs des sources de contenu et délais associés const sources = { 'Source A': 2000, // Délai de 2 secondes 'Source B': 3000, // Délai de 3 secondes 'Source C': 1500 // Délai de 1.5 secondes }; // Récupérer le contenu de la première source à répondre Promise.race(Object.entries(sources).map(([source, delay]) => getContentFromSource(source, delay))) .then(content => { console.log('Le contenu de la première source à répondre est :', content); }) .catch(error => { console.error('Une erreur s\'est produite :', error); });Explication
- Promise.race prend un tableau de promesses en entrée et renvoie une nouvelle promesse qui est résolue ou rejetée dès que l'une des promesses du tableau est résolue ou rejetée, en fonction de celle qui se produit en premier.
- Dans cet exemple, chaque getContentFromSource simule la récupération de contenu à partir d'une source avec un délai donné.
- Promise.race attend que la première source réponde et résout la promesse avec le contenu de cette source.
Avantages
- Réactivité : Promise.race permet de réagir rapidement à la première réponse disponible, ce qui peut être utile dans des scénarios où la réactivité est importante.
Limites
- Ignorance des autres réponses : Promise.race ignore les autres réponses qui peuvent être utiles si vous avez besoin de collecter les réponses de toutes les sources.
Quand utiliser
- Utilisez Promise.race lorsque vous souhaitez réagir rapidement à la première réponse disponible et que les autres réponses ne sont pas pertinentes pour votre cas d'utilisation.
-
async/await
Ces mots-clés permettent d'écrire du code asynchrone de manière synchrone, en utilisant des fonctions asynchrones. L'opérateur
awaitpermet d'attendre la résolution d'une promesse à l'intérieur d'une fonction asynchrone.Utilisation de Promise.race
Exemple : Affichage de contenu en fonction de la réponse la plus rapide
Supposons que vous ayez une application où vous avez besoin d'afficher du contenu provenant de différentes sources, mais vous voulez afficher le contenu dès qu'une source répond en premier.
// Fonction pour récupérer du contenu à partir d'une source const getContentFromSource = (source, delay) => { return new Promise((resolve, reject) => { // Simuler la récupération de contenu depuis une source avec un délai donné setTimeout(() => { resolve(`Contenu de ${source}`); }, delay); }); }; // URLs des sources de contenu et délais associés const sources = { 'Source A': 2000, // Délai de 2 secondes 'Source B': 3000, // Délai de 3 secondes 'Source C': 1500 // Délai de 1.5 secondes }; // Récupérer le contenu de la première source à répondre Promise.race(Object.entries(sources).map(([source, delay]) => getContentFromSource(source, delay))) .then(content => { console.log('Le contenu de la première source à répondre est :', content); }) .catch(error => { console.error('Une erreur s\'est produite :', error); });Explication
- Promise.race prend un tableau de promesses en entrée et renvoie une nouvelle promesse qui est résolue ou rejetée dès que l'une des promesses du tableau est résolue ou rejetée, en fonction de celle qui se produit en premier.
- Dans cet exemple, chaque getContentFromSource simule la récupération de contenu à partir d'une source avec un délai donné.
- Promise.race attend que la première source réponde et résout la promesse avec le contenu de cette source.
Avantages
- Réactivité : Promise.race permet de réagir rapidement à la première réponse disponible, ce qui peut être utile dans des scénarios où la réactivité est importante.
Limites
- Ignorance des autres réponses : Promise.race ignore les autres réponses qui peuvent être utiles si vous avez besoin de collecter les réponses de toutes les sources.
Quand utiliser
- Utilisez Promise.race lorsque vous souhaitez réagir rapidement à la première réponse disponible et que les autres réponses ne sont pas pertinentes pour votre cas d'utilisation.
-
En comprenant ces concepts et en maîtrisant ces techniques, vous serez en mesure de gérer efficacement l'asynchronisme dans vos applications JavaScript et d'écrire un code plus propre et plus maintenable.
Exercices, examens et projets
Atelier backend
Implémenter une API ou un service backend en conditions réelles.
Obligatoire ConsulterExamen backend
Vérifier les notions Node.js, API, sécurité et temps réel.
Obligatoire ConsulterProjet full stack
Déployer une application complète avec tests et documentation.
Livrables :
- API
- Interface
- Tests
- Déploiement