La programmation asynchrone en JavaScript a été progressivement acceptée par tout le monde. Auparavant, les gens l'ont généralement implémenté via la nidification de rappel, Settimeout, SetInterval, etc. Le code semble très intuitif et il est difficile de comprendre rapidement sans regarder la logique du code entière. Les fonctions asynchrones dans JavaScript incluent les fonctions d'E / S (ajax, postmessage, chargement IMG, charge de script, etc.), les fonctions de synchronisation (setTimeout, setInterval), etc.
Nous les connaissons tous. Dans des applications complexes, il y a souvent plusieurs couches de nidification, et même en pensant que certaines étapes n'ont pas été effectuées et les exceptions du programme sont causées. L'exemple le plus simple est: par exemple, si vous injectez un nœud dans le DOM, vous devez attendre que le nœud soit injecté et exploiter le nœud. Lorsqu'un grand nombre de nœuds sont injectés, il est souvent difficile de saisir le temps. Si nous avons le code pour s'appuyer sur les données des API tierces. Nous ne pouvons pas apprendre à quel point la latence est une réponse API, et d'autres parties de l'application peuvent être bloquées jusqu'à ce qu'elle renvoie le résultat. Promises fournit une meilleure solution à ce problème, elle est non bloquante et est complètement découplée du code.
Alors, permettez-moi de jeter un œil à la programmation asynchrone en JavaScript. Tout d'abord, je vous recommande de jeter un œil aux promesses relativement populaires / une spécification.
Promesses / une spécification
Remarque: Pour plus de compréhension, la description peut différer des promesses / une spécification;
Les promesses de CommonJS / A Spécification simplifient la programmation asynchrone en normalisant les interfaces API, ce qui rend notre code logique asynchrone plus facile à comprendre.
Nous appelons la mise en œuvre de la spécification Promises / A. L'objet de promesse n'a que trois états: non satisfait, accompli et échoué; Il a été initialement créé avec un état non réalisé, et l'État ne peut passer que de non satisfaits à épanouis, ou insatisfaits à échoué (échoué / rejeté). Une fois que l'état est rempli (terminé) ou a échoué (échoué / rejeté), l'état ne peut plus changer.
La spécification Promises / A fournit une solution pour décrire le concept de retard (ou futur) dans un programme. L'idée principale n'est pas d'exécuter une méthode, puis de bloquer l'application et d'attendre le retour du résultat avant de rappeler d'autres méthodes, mais de renvoyer un objet de promesse pour satisfaire l'écoute future. L'état accompli et l'état défaillant peuvent être écoutés. Promesse enregistre les rappels en implémentant une interface alors pour renvoyer l'objet Promise:
La copie de code est la suivante: Ensuite (FAILLILLEHHANDLER, ERRORHandler, ProgressHandler);
Alors l'interface est utilisée pour écouter différents états d'une promesse. Le HAUPLIELHHANDLER est utilisé pour écouter l'état épuisé, l'erreur de Handleur est utilisé pour écouter l'état défaillant, et le ProgressHandler est utilisé pour écouter l'état non réalisé. La promesse ne force pas l'écoute d'événements insatisfaite (par exemple, nous savons que l'ancienne version de jQuery (1.5, 1.6) est reportée est une mise en œuvre de Promise, mais ne met pas en œuvre l'État insatisfait qui écoute des allers-retours.
On pense généralement que l'interface d'alors renvoie un nouvel objet Promise, pas l'objet de promesse d'origine. Ce nouvel objet de promesse peut être compris comme une vue de l'objet de promesse original. Il ne contient qu'un ensemble de méthodes de l'objet Promise d'origine. Ces méthodes ne peuvent observer que l'état de l'objet Promise d'origine, mais ne peuvent pas modifier l'état interne de l'objet différé. Cela peut éviter les conflits entre plusieurs appelants, ce qui peut modifier l'état du nouvel objet Promise sans affecter d'autres appelants.
En outre, Promise fournit deux interfaces qui mettent en œuvre les transitions d'état de la résolution (état de mise en œuvre de non fini à terminée) et rejeter (état de mise en œuvre de l'inachevé à rejeter ou échoué).
Envoyez une image pour aider à comprendre:
Avec Promise, vous pouvez écrire une logique asynchrone avec un état d'esprit synchrone. Dans les fonctions asynchrones, vous ne pouvez pas utiliser Try / Catch pour attraper des exceptions, et vous ne pouvez pas lancer des exceptions. Avec Promise, nous pouvons définir directement explicitement un HorrorHandler, ce qui équivaut à capturer des exceptions.
Voici plusieurs bibliothèques de classe qui suivent les promesses / spécifications, quand, q, rsvp.js, jQuery.Deferred, etc.