Introduction
Les Promesses en Javascript peuvent être difficiles à comprendre. Par conséquent, je souhaite noter la manière dont je comprends les promesses.
Comprendre les Promesses
Une Promesse en bref:
“Imaginez que vous êtes un enfant. Votre mère promet de vous acheter un nouveau téléphone la semaine prochaine.”
Vous ne savez pas si vous obtiendrez ce téléphone avant la semaine prochaine. Votre mère peut vraiment acheter un tout nouveau téléphone pour vous, ou elle ne le fait pas.
C’est une promesse. Une promesse a trois états. Ils sont:
- En attente : Vous ne savez pas si vous obtiendrez ce téléphone
- Réalisée : Maman est contente, elle vous achète un tout nouveau téléphone
- Rejetée : Maman est mécontente, elle ne vous achète pas de téléphone
Créer une Promesse
Transformons cela en JavaScript.
Le code est assez expressif en soi.
Voici à quoi ressemble normalement la syntaxe d’une promesse :
Consommation des Promesses
Maintenant que nous avons la promesse, consommons-la :
Exécutons l’exemple et voyons le résultat !
Démo : https://jsbin.com/nifocu/1/edit?js,console
Chaînage des Promesses
Les promesses sont chaînables.
Disons que vous, l’enfant, promettez à votre ami que vous leur montrerez le nouveau téléphone quand votre mère vous en achètera un.
C’est une autre promesse. Écrivons-la !
Remarque : Nous pouvons raccourcir le code ci-dessus en l’écrivant comme suit :
Chainons les promesses. Vous, l’enfant, ne pouvez commencer la promesse showOff
qu’après la promesse willIGetNewPhone
.
Voilà comment vous pouvez chaîner la promesse.
Les promesses sont asynchrones
Les promesses sont asynchrones. Notons un message avant et après avoir appelé la promesse.
Quelle est la séquence de sortie attendue ? Vous pourriez vous attendre à :
1. before asking Mom
2. Hey friend, I have a new black Samsung phone.
3. after asking mom
Cependant, la séquence de sortie réelle est :
1. before asking Mom
2. after asking mom
3. Hey friend, I have a new black Samsung phone.
Vous ne vous arrêteriez pas de jouer en attendant la promesse de votre mère (le nouveau téléphone). C’est ce que l’on appelle asynchrone : le code s’exécutera sans bloquer ou attendre le résultat. Tout ce qui doit attendre qu’une promesse se réalise pour continuer est placé dans .then
.
Voici l’exemple complet en ES5 :
Promesses en ES5, ES6/2015, ES7/Next
ES5 – La plupart des navigateurs
Le code de démonstration est utilisable dans les environnements ES5 (tous les principaux navigateurs + NodeJs) si vous incluez la bibliothèque de promesses Bluebird. C’est parce qu’ES5 ne prend pas en charge les promesses nativement. Une autre bibliothèque de promesses célèbre est Q par Kris Kowal.
ES6 / ES2015 – Navigateurs modernes, NodeJs v6
Le code de démonstration fonctionne immédiatement car ES6 prend en charge les promesses de manière native. De plus, avec les fonctions ES6, nous pouvons simplifier davantage le code avec une fonction fléchée et utiliser const
et let
.
Voici l’exemple complet en code ES6:
Notez que tous les var
sont remplacés par const
. Toutes les function(resolve, reject)
ont été simplifiées en (resolve, reject) =>
. Il y a plusieurs avantages qui découlent de ces modifications.
ES7 – Async/Await
ES7 a introduit la syntaxe async
et await
. Elle rend la syntaxe asynchrone plus facile à comprendre, sans les .then
et .catch
.
Réécrivons notre exemple avec la syntaxe ES7:
Promesses et quand les utiliser
Pourquoi avons-nous besoin de promesses ? À quoi ressemblait le monde avant les promesses ? Avant de répondre à ces questions, revenons aux bases.
Fonction Normale VS Fonction Asynchrone
Examinons ces deux exemples. Les deux exemples effectuent l’addition de deux nombres : l’un utilise des fonctions normales, et l’autre effectue l’addition à distance.
Fonction Normale pour Additionner Deux Nombres
Fonction Asynchrone pour Additionner Deux Nombres
Si vous additionnez les nombres avec la fonction normale, vous obtenez le résultat immédiatement. Cependant, lorsque vous effectuez un appel à distance pour obtenir le résultat, vous devez attendre, et vous ne pouvez pas obtenir le résultat immédiatement.
Vous ne savez pas si vous obtiendrez le résultat car le serveur pourrait être hors ligne, lent à répondre, etc. Vous ne voulez pas que tout votre processus soit bloqué en attendant le résultat.
Appeler des API, télécharger des fichiers et lire des fichiers sont parmi les opérations asynchrones courantes que vous effectuerez.
Vous n’avez pas besoin d’utiliser des promesses pour un appel asynchrone. Avant les promesses, nous utilisions des callbacks. Les callbacks sont une fonction que vous appelez lorsque vous obtenez le résultat de retour. Modifions l’exemple précédent pour accepter un callback.
Action Asynchrone Suivante
Au lieu d’ajouter les nombres un par un, nous voulons les additionner trois fois. Dans une fonction normale, nous ferions ceci :-
Voici à quoi cela ressemble avec des callbacks :
Démo : https://jsbin.com/barimo/edit?html,js,console
Cette syntaxe est moins conviviale en raison des callbacks imbriqués profondément.
Éviter les Callbacks Imbriqués Profondément
Les promesses peuvent vous aider à éviter les callbacks imbriqués profondément. Examinons la version avec promesses du même exemple :
Avec les promesses, nous aplatissons le callback avec .then
. D’une certaine manière, cela semble plus propre car il n’y a pas de callback imbriqués. Avec la syntaxe async
d’ES7, vous pourriez encore améliorer cet exemple.
Observables
Avant de vous décider pour les promesses, il existe quelque chose qui est apparu pour vous aider à gérer les données asynchrones appelé Observables
.
Examinons le même exemple écrit avec les Observables. Dans cet exemple, nous utiliserons RxJS pour les observables.
Les Observables peuvent faire des choses plus intéressantes. Par exemple, delay
ajoute une fonction par 3 secondes
avec une seule ligne de code ou retry pour pouvoir réessayer un appel un certain nombre de fois.
Vous pouvez lire l’un de mes articles sur RxJs ici.
Conclusion
Se familiariser avec les callbacks et les promises est important. Comprenez-les et utilisez-les. Ne vous inquiétez pas encore des Observables. Les trois peuvent intervenir dans votre développement en fonction de la situation.
Source:
https://www.digitalocean.com/community/tutorials/understanding-javascript-promises