Comment JavaScript gère-t-il les réponses AJAX en arrière-plan?

puisque JavaScript fonctionne dans un seul thread, après qu'une requête AJAX est faite, que se passe-t-il réellement en arrière-plan? Je voudrais obtenir une connaissance approfondie de cela, quelqu'un peut jeter un peu de lumière?

130
demandé sur aziz punjani 2011-09-28 00:58:11

2 réponses

sous les couvertures, javascript a une file d'attente d'événements. Chaque fois qu'un fil javascript d'exécution se termine, il vérifie s'il y a un autre événement dans la file d'attente à traiter. S'il y en a un, il le retire de la file d'attente et déclenche cet événement (comme un clic de souris, par exemple).

le réseau de code natif qui se trouve sous l'appel ajax saura quand la réponse ajax est faite et un événement sera ajouté à la queue d'événement javascript. Comment le code natif sait quand l'appel ajax est fait dépend de l'implémentation. Il peut être implémenté avec des threads ou il peut aussi être piloté par événement lui-même (cela n'a pas vraiment d'importance). Le point de l'implémentation est que lorsque la réponse ajax est faite, un code natif saura que c'est fait et mettra un événement dans la file JS.

si aucun Javascript N'est en cours d'exécution à ce moment, l'événement sera immédiatement déclenché qui exécutera le gestionnaire de réponse ajax. Si quelque chose est en cours d'exécution au moment, l'événement sera alors traité lorsque le thread javascript courant de l'exécution sera terminé. Il n'y a pas besoin de sondage par le moteur javascript. Quand un morceau de Javascript termine l'exécution, le moteur JS vérifie juste la file d'attente d'événements pour voir s'il y a quelque chose d'autre qui doit fonctionner. Si c'est le cas, il sort l'événement suivant de la file d'attente et l'exécute (en appelant une ou plusieurs fonctions de rappel qui sont enregistrées pour cet événement). Si rien n'est dans la file d'attente d'événement, alors L'interprète js a temps libre (collecte des ordures ou inactivité) jusqu'à ce qu'un agent externe mette quelque chose d'autre dans la file d'attente de l'événement et le réveille à nouveau.

parce que tous les événements extérieurs passent par la file d'attente d'événements et qu'aucun événement n'est jamais déclenché alors que javascript exécute en fait quelque chose d'autre, il reste simple threadé.

voici quelques articles sur les détails:

201
répondu jfriend00 2018-07-23 13:07:23

vous pouvez trouver ici une documentation très complète sur le traitement des événements en javascript.

Il est écrit par un gars qui travaille sur l'implémentation javascript dans le navigateur Opera.

plus précisément, regardez les titres: "Event Flow"," Event Queuing " et "Non-user Events": vous apprendrez que:

  1. Javascript fonctionne dans un seul thread pour chaque onglet de navigateur ou fenêtre.
  2. Les événements
  3. sont placés en file d'attente et exécutés de façon séquentielle.
  4. XMLHttpRequest sont exécutés par l'implémentation et les callbacks sont exécutés en utilisant la file d'event.

Note: le lien Original était: lien , mais est maintenant mort.

15
répondu qwertzguy 2017-11-08 19:47:35