Comme vous le savez peut-être, l'environnement d'exécution de la langue JavaScript est "thread unique".
Le soi-disant "thread unique" signifie qu'une seule tâche ne peut être terminée qu'à la fois. S'il y a plusieurs tâches, vous devez faire la queue, terminer la tâche précédente, exécuter la tâche suivante, etc.
L'avantage de ce modèle est qu'il est relativement simple à mettre en œuvre et que l'environnement d'exécution est relativement simple; exécution de l'ensemble du programme. Les navigateurs communs ne répondent pas souvent (faux décès) parce qu'un certain morceau de code JavaScript s'exécute pendant longtemps (comme une boucle morte), ce qui a provoqué la fin de la page entière à cet endroit et d'autres tâches ne peuvent pas être exécutées.
Pour résoudre ce problème, le langage JavaScript divise le mode d'exécution des tâches en deux types: synchrone (synchrone) et asynchrone (asynchrone).
"Mode synchrone" est le mode de la section précédente, et cette dernière tâche attend la fin de la tâche précédente, puis l'exécute. complètement différent, et chaque tâche est qu'il y a une ou plusieurs fonctions de rappel (rappel). Pour terminer, donc l'ordre d'exécution du programme est et la tâche.
"Mode asynchrone" est très important. Du côté du navigateur, les opérations à long terme doivent être exécutées de manière asynchrone pour éviter que le navigateur ne perde la réponse. Côté serveur, "Mode asynchrone" est même le seul mode, car l'environnement d'exécution est unique, si toutes les demandes HTTP peuvent être exécutées de manière synchrone, les performances du serveur baisseront fortement et perdront bientôt sa réponse.
1. Fonction de rappel
Il s'agit de la méthode la plus élémentaire de programmation asynchrone.
Supposons qu'il existe deux fonctions F1 et F2, ce dernier attendant le résultat d'exécution de la première.
La copie de code est la suivante:
F1 ();
f2 ();
Si F1 est une tâche qui prend du temps, vous pouvez envisager de réécrire F1 et d'écrire F2 comme fonction de rappel de F1.
La copie de code est la suivante:
fonction f1 (rappel) {
setTimeout (function () {
// Code de tâche de F1
callback ();
}, 1000);
}
Le code d'exécution devient ceci:
F1 (F2);
L'avantage des fonctions de rappel est qu'ils sont simples, faciles à comprendre et à déployer, et l'inconvénient est qu'ils ne sont pas propices à la lecture et à la maintenance du code. Soyez très chaotique et chaque tâche ne peut spécifier qu'une seule fonction de rappel.
2. Surveillance des événements
Une autre idée est d'adopter un modèle axé sur les événements. L'exécution d'une tâche ne dépend pas de l'ordre du code, mais de savoir si un événement se produit.
Prenons F1 et F2 comme exemples. Tout d'abord, liez un événement pour F1 (la méthode d'écriture jQuery utilisée ici).
La copie de code est la suivante:
f1.on («Done», F2);
La ligne de code ci-dessus signifie que lorsque l'événement terminé se produit en F1, F2 est exécuté. Ensuite, réécrivez F1:
La copie de code est la suivante:
fonction f1 () {
setTimeout (function () {
// Code de tâche de F1
f1.trigger («fait»);
}, 1000);
}
F1.trigger («Done») signifie qu'après la fin de l'exécution, l'événement Terminé est déclenché immédiatement, commençant ainsi à exécuter F2.
L'avantage de cette méthode est qu'il est relativement facile à comprendre. L'inconvénient est que l'ensemble du programme deviendra motivé par des événements et que le processus d'opération deviendra très clair.
3. Publier / abonner
L '"événement" dans la section précédente peut être entièrement compris comme un "signal".
Nous supposons qu'il y a un "centre de signalisation". Ceci s'appelle "Publish-Subscribe Pattern", également connu sous le nom de "modèle d'observateur".
Il existe de nombreuses implémentations de ce modèle.
Tout d'abord, F2 s'abonne au signal "fait" au "Centre de signal" jQuery.
La copie de code est la suivante:
jQuery.Subscribe ("Done", F2);
Ensuite, F1 est réécrit comme suit:
La copie de code est la suivante:
fonction f1 () {
setTimeout (function () {
// Code de tâche de F1
jQuery.publish ("fait");
}, 1000);
}
jQuery.publish ("fait") signifie qu'après la fin de l'exécution de F1, un signal "fait" est émis au "Centre de signal" jQuery, déclenchant ainsi l'exécution de F2.
De plus, après l'exécution de F2, le désabonnement peut également être non abonné.
La copie de code est la suivante:
jQuery.unSubscribe ("Done", F2);
La nature de cette approche est similaire à "l'écoute des événements", mais est nettement meilleure que ce dernier. Parce que nous pouvons surveiller le fonctionnement du programme en examinant le "centre de messages" pour comprendre combien de signaux existent et combien d'abonnés pour chaque signal.
4. Promet l'objet
L'objet Promise est une spécification proposée par le groupe de travail CommonJS, dans le but de fournir une interface unifiée pour la programmation asynchrone.
Autrement dit, son idée est que chaque tâche asynchrone renvoie un objet Promise, qui a une méthode alors qui permet de spécifier la fonction de rappel. Par exemple, la fonction de rappel F2 de F1 peut être écrite comme:
La copie de code est la suivante:
f1 (). alors (f2);
F1 doit être réécrit comme suit (l'implémentation de jQuery est utilisée ici):
La copie de code est la suivante:
fonction f1 () {
var dfd = $ .deferred ();
setTimeout (function () {
// Code de tâche de F1
dfd.Resolve ();
}, 500);
retour dfd.promise;
}
L'avantage de l'écriture de cette façon est que la fonction de rappel est devenue une méthode d'écriture de chaîne, et le flux du programme peut être vu très clairement, et il existe un ensemble complet de méthodes de support qui peuvent réaliser de nombreuses fonctions puissantes.
Par exemple, spécifiez plusieurs fonctions de rappel:
f1 (). Ensuite (F2) .Then (F3);
Par exemple, spécifiez la fonction de rappel lorsqu'une erreur se produit:
f1 (). alors (f2) .fail (f3);
De plus, il a un avantage qu'aucune des trois méthodes précédentes n'a: si une tâche a été terminée, ajoutez une fonction de rappel et la fonction de rappel sera exécutée immédiatement. Donc, vous n'avez pas à vous soucier de manquer un événement ou un signal. L'inconvénient de cette méthode est qu'il est relativement difficile d'écrire et de comprendre.