56 votes

JavaScript est-il multithread?

Voici mon problème: j'ai besoin d'dynamiquement télécharger plusieurs scripts à l'aide de jQuery.getScript() et d'exécuter certaines JavaScript code après tous les scripts ont été chargés, donc mon plan était de faire quelque chose comme ceci:

function GetScripts(scripts, callback)
{
  var len = scripts.length
  for (var i in scripts)
  {
    jQuery.getScript(scripts[i], function() 
    {
      len --;
      // executing callback function if this is the last script that loaded
      if (len == 0)
        callback()  
    })
  }
}

Cela ne fonctionnera de manière fiable si nous supposons que le script.onload événements pour chaque script d'incendie et d'exécuter séquentiellement et de manière synchrone, il n'y aurait jamais une situation où deux ou plusieurs gestionnaires d'événements passerait vérifier (len == 0) et exécuter une méthode de rappel.

Donc ma question: est - ce que l'hypothèse correcte et si non, quelle est la façon de réaliser ce que je suis en train de faire?

82voto

gnarf Points 49213

Non, JavaScript n'est pas multi-thread. Il est piloté par les événements et votre hypothèse selon laquelle les événements sont déclenchés séquentiellement (en supposant qu'ils se chargent séquentiellement) correspond à ce que vous verrez. Votre implémentation actuelle semble correcte. Je crois que .getScript() jQuery injecte une nouvelle balise <script> , ce qui devrait également les forcer à se charger dans le bon ordre.

35voto

Ivan Nevostruev Points 14934

Actuellement, JavaScript n'est pas multithread, mais les choses vont changer dans un proche avenir. Il y a une nouvelle chose dans HTML5 appelée Worker . Cela vous permet de faire du travail en arrière-plan.

Mais il n’est actuellement pas pris en charge par tous les navigateurs.

16voto

Jeff Sternal Points 30147

Le JavaScript (ECMAScript) spécification ne définit pas de filetage ou de mécanismes de synchronisation.

En outre, les moteurs JavaScript dans nos navigateurs sont délibérément single-threaded, en partie parce que permettant à plus d'un thread d'INTERFACE utilisateur à faire fonctionner simultanément ouvrir une énorme boîte de pandore. Si votre hypothèse et la mise en œuvre sont corrects.

Au passage, un autre intervenant a fait allusion au fait que tous les JavaScriptengine vendeur pourrait ajouter le filetage et les fonctions de synchronisation, ou un vendeur pourrait permettre aux utilisateurs de mettre en œuvre ces entités elles-mêmes, comme décrit dans cet article: Multi-thread JavaScript?

12voto

Dan Monego Points 3203

JavaScript n'est absolument pas multithread - vous avez la garantie que tout gestionnaire que vous utilisez ne sera pas interrompu par un autre événement. Tous les autres événements, tels que les clics de souris, XMLHttpRequest, sont retournés et les minuteries seront mises en file d'attente pendant l'exécution de votre code et exécutées les unes après les autres.

10voto

Hannoun Yassir Points 6385

Non, tous les navigateurs ne vous donnent qu'un seul thread pour JavaScript.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X