Dans le domaine de la programmation, les rappels jouent un rôle crucial dans l'exécution asynchrone. Bien qu’il soit largement admis que les rappels fonctionnent de manière asynchrone, le mécanisme sous-jacent à ce comportement reste pour beaucoup incertain. Cet article approfondira la syntaxe et les détails d'implémentation qui permettent une exécution asynchrone dans la programmation basée sur le rappel.
Contrairement à la croyance populaire , il n'existe aucun élément syntaxique spécifique qui dicte si une fonction s'exécutera de manière asynchrone ou synchrone. Les rappels peuvent fonctionner dans l'un ou l'autre mode, comme en témoignent les cas suivants :
Asynchrone :
setTimeout(function(){ console.log("this is async"); }, 100);
Synchrone :
an_array.forEach(function(x){ console.log("this is sync"); });
JavaScript lui-même ne possède aucun mécanisme inhérent pour l'exécution asynchrone de fonctions. Pour obtenir ce comportement, l'une des deux approches suivantes peut être adoptée :
Les fonctions codées en C, comme setTimeout, s'appuient sur des techniques sophistiquées pour faciliter l'exécution asynchrone. Le principal mécanisme impliqué est la boucle d'événements.
Au cœur de chaque navigateur Web se trouve la boucle d'événements, un vestige de protocoles de réseautage asynchrones apparus au début d’Internet. Ce mécanisme permet au navigateur de jongler avec plusieurs requêtes d'E/S simultanément sans recourir à des threads supplémentaires.
La boucle d'événements repose sur un appel système essentiel en C appelé select() (ou des variantes similaires) :
select (max, readlist, writelist, errlist, timeout)
select() permet au système de surveiller simultanément de nombreuses opérations d'E/S. Lorsque les données deviennent disponibles sur l'un des canaux d'E/S sélectionnés, la fonction revient, signalant au navigateur de lancer l'exécution de rappel appropriée.
Lorsqu'une fonction de rappel est enregistrée, l'interpréteur JavaScript la stocke et appelle simultanément la fonction select(). À son retour, l'interpréteur corrèle les rappels avec des canaux d'E/S spécifiques et déclenche leur exécution.
select() permet également au navigateur de régir le timing d'invocation des rappels via des délais d'attente. En régulant méticuleusement l'argument de délai d'attente transmis à select(), les rappels peuvent être programmés pour être exécutés à des intervalles prédéterminés. Cela constitue la base de fonctions telles que setTimeout et setInterval.
Outre la boucle d'événements, les navigateurs Web emploient des Web Workers pour faciliter l'exécution asynchrone du code JavaScript dans des threads séparés. Cependant, ces travailleurs doivent toujours s'interconnecter avec la boucle d'événements principale via select() pour communiquer avec le thread principal.
Node.js, comme les navigateurs Web, exploite le threading pour les opérations d'E/S de fichiers/disques. Une fois ces tâches terminées, les threads communiquent avec la boucle d'événements Node.js, provoquant l'exécution des rappels associés.
Le concept d'asynchrone l'exécution dans la programmation basée sur le rappel n'est pas directement perceptible à partir de la syntaxe elle-même. C'est le résultat de mécanismes sous-jacents, principalement la boucle d'événements et son interaction avec des fonctions de niveau C comme select(). La boucle d'événements permet aux navigateurs de gérer plusieurs opérations d'E/S simultanément, garantissant ainsi l'exécution non bloquante des rappels. Comprendre ces principes est crucial pour comprendre les subtilités de la programmation asynchrone et ses applications sur diverses plates-formes.
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!