Javascript est un thread unique. Ce que je comprends de cela, c'est que si JS i exécutant en ligne de code laisse dire une fonction. Il ne peut pas passer à la ligne suivante à moins que cette fonction n'ait été supprimée de la pile.
Cela étant dit, je ne comprends pas comment les promesses nous permettent d'exécuter d'autres blocs de code sur la route, alors que l'interprète résout toujours le code de la promesse.
Je suis un noob dans JS, donc j'essaie de comprendre l'implémentation sous-jacente.
J'ai vu un exemple PHP implémentation de Promises et l'idée est que PHP peut bifurquer un processus séparé dans un thread différent qui renvoie le signal au thread principal lorsque le code asynchrone a été exécuté.
Cela fonctionne-t-il de la même manière en Javascript?
Merci
L'exécution parallèle ou non ordonnée ou asynchrone n'est pas vraiment liée au nombre de threads. Penses-y. Un seul thread peut toujours faire la commutation et faire n choses en même temps, en morceaux. Comme un processeur logiciel.
C'est vraiment la façon dont la plateforme d'exécution est implémentée. Vous pouvez avoir l'illusion d'un tel traitement via une file d'attente d'événements et un seul thread de boucleur qui fonctionne sur cette file d'attente.
Dans le cas des moteurs JavaScript, vous pouvez penser que pour chaque opération asynchrone définie sur n'importe quelle ligne du code source, le moteur n'attend pas pour terminer cette opération, il suffit plutôt de la placer dans la file d'attente et d'y répondre de temps en temps, jusqu'à ce que il est terminé.
Les valeurs promises (ou futures) ne contiennent rien lorsque la ligne est exécutée et la ligne suivante est évaluée. Ce n'est que quelque temps plus tard que les valeurs "résolvent" et tout ce qui dépend de cette valeur est également résolu, et ainsi de suite, jusqu'à ce que tout soit résolu et que la file d'attente soit vide. Pensez à un graphique réduit à la racine à mesure que les valeurs deviennent disponibles et que le calcul en attente est terminé.
Les promesses dans JS sont un moyen de faire de la programmation asynchrone, ce qui n'est pas le même que le multithreading. Essentiellement, dans le code à thread unique synchrone, lorsqu'il y a une sorte d'E/S, le processeur émet simplement une instruction à un autre matériel , et c'est tout. Après cela, il reste juste à ne rien faire (du moins du point de vue de votre programme), et attend jusqu'à ce que l'autre matériel soit terminé - et cela généralement prend beaucoup de temps (dans le sens où le CPU pourrait accomplir un nombre important d'autres tâches pendant cette période). Il n'y a donc pas de fil supplémentaire dans le sens habituel du mot, mais il y a un traitement en parallèle (il ne se produit tout simplement pas dans le CPU).
Avec la programmation asynchrone, vous affectez essentiellement un rappel à exécuter lorsque la tâche réussit (ou échoue), appelez du code pour "déclencher" l'opération asynchrone, puis vous poursuivez votre propre entreprise, en faisant un autre travail utile en attendant . Lorsque l'autre matériel termine la tâche (ou échoue), l'UC est notifiée et exécute le rappel approprié.
Vous pouvez en savoir plus sur la façon dont le CPU gère les événements asynchrones ici.
Voir aussi: Accès simultané vs multi-threading vs programmation asynchrone: expliqué .
La tâche asynchrone peut être bifurquée par le runtime JS, par exemple lorsque seuls des systèmes externes sont impliqués, mais elle peut également être démarrée/exécutée lorsqu'il n'y a plus d'autre code à exécuter. Dans le premier cas, au moins votre rappel d'achèvement sera planifié pour une exécution ultérieure. Dans JS, cela se produit lorsque la pile d'appels devient vide et que la soi-disant boucle d'événements exécute la tâche planifiée suivante ou traite les événements observés (comme les clics). C'est pourquoi dans JS, vous ne pouvez pas écrire de boucles infinies ou d'autres constructions qui conduisent à des appels sans fin.