Maison > interface Web > js tutoriel > Comment JavaScript rend-il réellement les rappels asynchrones ?

Comment JavaScript rend-il réellement les rappels asynchrones ?

DDD
Libérer: 2024-11-19 14:44:02
original
551 Les gens l'ont consulté

 How Does JavaScript Actually Make Callbacks Asynchronous?

Exploration des mécanismes des rappels asynchrones

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.

Syntaxe de rappel : aucune indication implicite

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);
Copier après la connexion

Synchrone :

an_array.forEach(function(x){
    console.log("this is sync");
});
Copier après la connexion

Dévoilement de l'exécution asynchrone

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 :

  1. Utiliser des fonctions asynchrones externes, telles que setTimeout ou des Web Workers, pour gérer la logique.
  2. Recourir au niveau C implémentation.

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.

La boucle d'événements : orchestrateur de l'asynchronie

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)
Copier après la connexion

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.

Le rôle et la mise en œuvre du navigateur

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 et C Threads : une perspective alternative

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.

Conclusion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal