J'y pense et c'est ce que j'ai trouvé:
Voyons ce code ci-dessous:
console.clear();
console.log("a");
setTimeout(function(){console.log("b");},1000);
console.log("c");
setTimeout(function(){console.log("d");},0);
Une demande arrive et le moteur JS commence à exécuter le code ci-dessus étape par étape. Les deux premiers appels sont des appels de synchronisation. Mais quand il s'agit de setTimeout
méthode, cela devient une exécution asynchrone. Mais JS en revient immédiatement et continue à s'exécuter, ce qui est appelé Non-Blocking
ou Async
. Et il continue de travailler sur d'autres, etc.
Les résultats de cette exécution sont les suivants:
acdb
Donc, fondamentalement, le second setTimeout
est terminé en premier et sa fonction de rappel est exécutée plus tôt que la première et cela a du sens.
Nous parlons ici d'une application monothread. JS Engine continue d'exécuter cela et à moins qu'il ne termine la première requête, il ne passera pas à la seconde. Mais la bonne chose est qu'il n'attendra pas les opérations de blocage comme la setTimeout
résolution, il sera donc plus rapide car il accepte les nouvelles demandes entrantes.
Mais mes questions se posent autour des éléments suivants:
# 1: Si nous parlons d'une application monothread, quel mécanisme traite setTimeouts
alors que le moteur JS accepte plus de requêtes et les exécute? Comment le thread unique continue-t-il de travailler sur d'autres demandes? Ce qui fonctionne pendant setTimeout
que d'autres demandes continuent d'arriver et sont exécutées.
# 2: Si ces setTimeout
fonctions sont exécutées dans les coulisses alors que d'autres requêtes arrivent et sont exécutées, qu'est-ce qui exécute les exécutions asynchrones dans les coulisses? Quelle est cette chose dont nous parlons appelé le EventLoop
?
# 3: Mais la méthode entière ne devrait-elle pas être placée dans le EventLoop
pour que tout soit exécuté et que la méthode de rappel soit appelée? C'est ce que je comprends lorsque je parle des fonctions de rappel:
function downloadFile(filePath, callback)
{
blah.downloadFile(filePath);
callback();
}
Mais dans ce cas, comment le moteur JS sait-il s'il s'agit d'une fonction asynchrone afin de pouvoir placer le rappel dans le EventLoop
? Peut-être quelque chose comme le async
mot - clé en C # ou une sorte d'attribut qui indique la méthode que JS Engine prendra est une méthode asynchrone et devrait être traitée en conséquence.
# 4: Mais un article dit tout à fait contrairement à ce que je supposais sur la façon dont les choses pourraient fonctionner:
La boucle d'événements est une file d'attente de fonctions de rappel. Lorsqu'une fonction asynchrone s'exécute, la fonction de rappel est poussée dans la file d'attente. Le moteur JavaScript ne démarre pas le traitement de la boucle d'événements tant que le code après l'exécution d'une fonction asynchrone n'est pas exécuté.
# 5: Et il y a cette image ici qui pourrait être utile, mais la première explication de l'image dit exactement la même chose que celle mentionnée dans la question numéro 4:
Ma question ici est donc d'obtenir des éclaircissements sur les éléments énumérés ci-dessus?