Les développeurs considèrent souvent les rappels avec dédain, les associant à "l'enfer de rappel" redouté. Cependant, les rappels sont fondamentaux pour la nature asynchrone de JavaScript. La clé n'évite pas les rappels, mais la maîtrise de leur utilisation efficace. Cet article explore les stratégies de gestion des rappels, passant de la nidification problématique au code asynchrone plus propre et plus maintenable.
Jeter entièrement les rappels s'apparente à jeter le bébé avec l'eau du bain. Ils sont un outil puissant, et les remplacer souvent déplace simplement le problème. Explorons comment les pratiques de programmation solides peuvent exploiter la puissance des rappels tout en évitant les pièges. Nous nous concentrerons sur des principes solides pour guider notre approche.
Prise des clés:
async
/ await
, démontrant comment ces fonctionnalités simplifient la programmation asynchrone et offrent un chemin hors de "Rappel Hell". Qu'est-ce que l'enfer de rappel?
Un rappel est une fonction passée comme un argument à une autre fonction, exécutant à un moment ultérieur et non spécifié. La fonction de réception détermine quand l'invoquer. Ceci est crucial pour les opérations asynchrones comme les demandes AJAX.
Le problème se pose lorsque le code asynchrone repose sur des rappels imbriqués, créant des structures profondément en retrait - la tristement célèbre "pyramide de malheur". Considérez cet exemple en utilisant setTimeout
pour simuler les appels asynchrones:
setTimeout(function (name) { var catList = name + ','; // ... more nested setTimeouts ... }, 1, 'Panther');
Cette structure imbriquée devient rapidement illisible et difficile à maintenir.
Adressant le problème: fonctions nommées et structure améliorée
Le remplacement des fonctions anonymes par des fonctions nommées améliore la lisibilité:
setTimeout(getPanther, 1, 'Panther'); function getPanther(name) { catList = name + ','; setTimeout(getJaguar, 1, 'Jaguar'); } // ... more named functions ...
Bien que cela élimine la pyramide visuelle, il introduit des problèmes potentiels de portée et du code de duplication.
Inversion de dépendance pour le découplage
Le principe d'inversion de dépendance préconise le codage des abstractions, et non des implémentations. Nous pouvons y parvenir en créant un contrat pour notre rappel:
function buildFerociousCats(list, returnValue, fn) { setTimeout(function asyncCall(data) { var catList = list === '' ? data : list + ',' + data; fn(catList); }, 1, returnValue); }
Cette fonction accepte désormais un rappel (fn
) comme dépendance, découplant la logique centrale à partir de détails d'implémentation spécifiques.
Rappels polymorphes pour la flexibilité
Pour améliorer la flexibilité, nous pouvons introduire le polymorphisme. Cela nous permet de modifier le comportement du rappel sans modifier la fonction centrale:
setTimeout(function (name) { var catList = name + ','; // ... more nested setTimeouts ... }, 1, 'Panther');
Maintenant, l'objet cat
résume la fonction de liste et de délimiteur, permettant une commutation facile entre différents délimiteurs (par exemple, virgule, tuyau).
promesses et asynchrones / attendre pour une lisibilité accrue
Les promesses et async
/ await
fournissent des moyens plus structurés de gérer les opérations asynchrones. Emballage buildFerociousCats
dans une promesse:
setTimeout(getPanther, 1, 'Panther'); function getPanther(name) { catList = name + ','; setTimeout(getJaguar, 1, 'Jaguar'); } // ... more named functions ...
Cela permet un chaînage plus propre en utilisant .then()
. async
/ await
simplifie davantage cela en permettant à l'écriture de code asynchrone dans un style plus synchrone:
function buildFerociousCats(list, returnValue, fn) { setTimeout(function asyncCall(data) { var catList = list === '' ? data : list + ',' + data; fn(catList); }, 1, returnValue); }
Conclusion
La maîtrise des rappels en JavaScript implique de comprendre leurs nuances et d'appliquer des principes de programmation sonore. En adoptant des techniques comme les fonctions nommées, l'inversion de dépendance, le polymorphisme, les promesses et async
/ await
, nous pouvons aller au-delà de "l'enfer de rappel" et créer un code javascript asynchrone élégant et maintenable. La flexibilité de JavaScript permet de bonnes pratiques de programmation; Une solide compréhension des fondamentaux est la clé de l'écriture de code efficace et lisible.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!