Multithreading en JavaScript

Imiter le multithreading en JavaScript

Un événement proactive axée sur l'architecture est comme le chien de demander (si c'est possible), "Quand allez-vous lancer la balle, alors, hein, quand?" Les pseudo-architecture thread est implémenté en utilisant temporisations. Le pseudo-fil est le résultat d'une fonction périodique ou appelez objet, et la mise en œuvre complète est indiqué dans le code source suivant.

 Source: / client / scripts / jaxson / Common.js fonction ThreadObject () (this.obj = null; this.data = null; this.intervalId = null; this.isUsed = false;) ThreadObject.prototype.makeCall = function () ( if (typeof (this.obj) == "function") (this.obj (this.data);) else if (typeof (this.obj) == "object") (this.obj.run (this.data );)) = (var Thread threadObjects: new Array (), startThread: function (obj, données, temps) (for (var c1 = 0; C1 <this.threadObjects.length; C1 + +) (if (! ce . threadObjects [c1]. vise d'abord) (this.threadObjects [c1]. vise d'abord = true; this.threadObjects [c1]. data = data; this.threadObjects [c1]. obj = obj; this.threadObjects [c1]. intervalId = window.setInterval ( "Thread.threadObjects [" + c1 + "]. MakeCall ()", temps); this.threadObjects retour [c1]. intervalId;)) throw new Error ( "Impossible de démarrer un thread"); ), endThread: function (intervalID) (for (var c1 = 0; C1 <this.threadObjects.length; C1 + +) (if (this.threadObjects [c1]. intervalId == intervalId) (window.clearInterval (intervalID) ; this.threadObjects [c1]. vise d'abord = false;)))) InitializeThreads fonction (MaxThreads) (for (var c1 = 0; C1 <MaxThreads; C1 + +) (Thread.threadObjects.push (nouveau ThreadObject ()); )) InitializeThreads (30);

Dans la source, deux types d'objets sont définis: ThreadObject et du fil. Le type ThreadObject est utilisé pour gérer le fil se moquer, et de fils gère les fils fantaisie. La fonction InitializeThreads est utilisé pour mettre en place le pseudo-threading environnement. Pour expliquer ce code source, une approche top-down est utilisée.

Lorsque le fichier JavaScript contenant la pseudo-architecture thread est chargé, la fonction InitializeThreads est appelée avec une valeur de paramètre de 30 ans. InitializeThreads est utilisé pour initialiser le tableau de pseudo-fils qui sera appelé. Coder en dur dans la limite de 30 fils mai sembler comme une mauvaise pratique de programmation, mais il ya une raison à cela. Pour créer un pseudo-fil, vous créez un événement périodique, ce qui signifie que vous devez utiliser soit le window.setInterval ou window.setTimeout méthode. Appelant ou l'autre de ces méthodes nécessite une référence de fonction ou un bout de code JavaScript. Le problème avec ces deux approches est que vous avez besoin de sérialiser le code source. Par exemple, imaginez que vous souhaitez appeler ou l'autre des méthodes d'événement périodique avec un objet de référence inst locales, comme l'illustre le code source suivant:

window.setInterval ( "CallFunction (INST)", 300);
  

La référence à inst dans le tampon de la chaîne n'aura pas de sens, parce que lorsque la minuterie exécute des périodiques, des variables locales ne sont pas dans leur contexte. L'exécution se traduira par une erreur. Une autre façon d'appeler la fonction consiste à sérialiser inst à un tampon, mais qui a l'inconvénient que l'État ne soient utilisées dans le cas périodique ne sera pas la même instance de l'objet, ainsi que si des modifications sont apportées entre l'appel de la fonction setInterval et l'expiration de la minuterie, ils ne seront pas présents. Le seul moment où l'INST est en cours de validité est de savoir si INST est une variable globale. En règle générale, le plus sûr moyen de rendre le contexte des méthodes spécifiques à l'appel en utilisant les méthodes et setInterval setTimeout est d'utiliser une référence mondiale. Une référence mondiale peut être créé dynamiquement par instanciation des variables aléatoires ou en utilisant une référence d'index de tableau. L'approche choisie par fil est l'index de tableau. La fonction InitializeThreads initialisera 30 références mondiales de ThreadObject. Chaque ThreadObject a quatre membres de données:

• obj: référence à l'objet à exécuter. La méthode ThreadObject.makeCall peut distinguer entre une fonction et l'objet. Si obj est une fonction, puis obj sera appelée à l'aide d'une notation de fonction. Si obj est une instance d'objet, alors la méthode obj.run est appelée.

• Les données: Références des données utilisées comme un contexte où obj est exécuté.

• intervalId: référence à la valeur retournée par la méthode window.setInterval. Cette valeur est utilisée pour arrêter l'événement périodique.

• vise d'abord: Utilisé par thread pour déterminer si un index de tableau est actuellement utilisé. Quand un nouveau thread veut commencer, les recherches méthode startThread pour un index vide, où vise d'abord égale à une valeur de false. Une fois qu'un thread a été démarré, le membre de données vise d'abord se voit attribuer une valeur true. Et quand le thread a terminé son exécution, le membre de données vise d'abord se voit attribuer une valeur de nouveau faux. Le pseudo-architecture fil est utilisé dans la déclaration de DynamicIterator référencé par le onmouseover navigation métadonnées et les événements onmouseout. Lorsque vous déplacez la souris d'une région de la page HTML à l'autre et l'autre région, l'événement onmouseover mis en oeuvre, l'événement est déclenché. L'événement onmouseover est déclenché uniquement la première fois les mouvements de la souris sur l'événement, et qui cause la méthode startIteration à être appelé, Thread.startThread appel. Quand la souris se déplace hors de la région de la navigation de métadonnées, la méthode est appelée StopIteration, appelant Thread.endThread. La mise en œuvre de startIteration et StopIteration est défini comme suit.

 Source: / client / scripts / jaxson / uimorphing.js (DynamicIterator)intervalId: 0, startIteration: fonction (direction) (this.intervalId = Thread.startThread (function (direction) (DynamicIterator.shiftArrayElements (direction);), la direction, 500);), StopIteration: function () (Thread.endThread ( this.intervalId);),

Mettre les morceaux restants de la clientèle Ensemble

Plusieurs fois, j'ai référencé DynamicIterator la mise en œuvre, qui est utilisé pour naviguer dans les métadonnées du jeu de résultats. Le rôle principal de DynamicIterator est de charger les éléments de métadonnées de navigation, et quand les différents éléments sont référencés, les principales données est chargé. J'explique la mise en œuvre de DynamicIterator en morceaux, avec la représentation suivante de l'initialisation des éléments de navigation.

 Source: / client / scripts / jaxson / uimorphing.js var DynamicIterator = (lastElem: null, floatingIframe: null, parentRow: null, initialize: function (floatingIframeID, parentRowID) (this.floatingIframe = document.getElementById (floatingIframeID); this.parentRow = document.getElementById (parentRowID); this.doLayout (); this.getMoreRootElements (0);), doLayout: function () (= this.floatingIframe.style.width document.body.clientWidth - 4; this.floatingIframe.style. hauteur = document.body.clientHeight - 104;) / / D'autres déclarations ...);

 

Pour en revenir au début de la «Mettre en œuvre le code HTML du client» de l'article, rappelle le morceau de code HTML qui a mis sur l'événement body.onload, qui appelle la fonction Initialize local. Dans la mise en œuvre de Initialize, DynamicIterator.initialize la méthode est appelée. Calling DynamicIterator.initialize feront référence les éléments d'interface utilisateur HTML avec l'instance DynamicIterator.

DynamicIterator.initialize attend deux éléments d'interface utilisateur HTML: le iframe flottante (this.floatingIframe) et la ligne du tableau (this.parentRow) qui contient les éléments de navigation. DynamicIterator besoins de ces deux éléments de l'interface utilisateur, car il charge les données s'affichent dans la zone de navigation. Après les éléments de l'interface utilisateur ont été attribués aux membres de données, la méthode doLayout est appelée. Le but de doLayout est de redimensionner l'iframe afin qu'il couvre la zone client approprié. Et le dernier appel de méthode dans DynamicIterator.initialize est la vocation de la méthode getMoreRootElements, qui est responsable du chargement des éléments de métadonnées de navigation. Dans le cadre de DynamicIterator, la méthode getMoreRootElements est déclaré comme une fonction vide semblable à la suivante:

getMoreRootElements: fonction (direction) ()

La fonction vide est un espace réservé, et il est prévu que le code HTML sera déclarer une mise en œuvre. Dans le cas du code HTML, getMoreRootElements est défini comme suit.

 Source: / client / articles ajaxrest / architecture / DynamicIterator.getMoreRootElements dynamiclist.html = function (direction) (if (direction == 0) (var asynchrone = FactoryHttp.getCachedAsynchronous (); asynchronous.settings = (onComplete: function (xmlhttp) (var arrTickers = new Array (); Tickers var = JSON.parse (xmlhttp.responseText); for (var c1 = 0; C1 <tickers.length; C1 + +) (arrTickers.push ((text: tickers [c1], url : "/ pyservices / négociant / histoire / Tickers /" + Tickers [c1]));) DynamicIterator.associateElements (arrTickers);)) asynchronous.get ( "/ pyservices / négociant / histoire / tickers");))

Dans le cas du code HTML, les bannières qui représentent les métadonnées utilisées pour naviguer dans l'application sont chargés une fois. Métadonnées peuvent être illimitée, mais souvent il peut être limité à une taille fixe fixe, même si ce format prévu est très grand. En regardant l'exemple, chaque élément de métadonnées est un ticker qui peut avoir une à quatre lettres (en moyenne). Si vous multipliez ce nombre par 1000 Tickers, alors vous devez télécharger environ 4KB-5KB de données (en cette ère de la large bande , le téléchargement 4KB-5KB est triviale). La demande d'actions permettra au plus 50 Tickers en raison de limitations techniques, donc toutes les bannières peuvent être téléchargés en une seule requête.

Dans le cas de notre exemple, getMoreRootElements avec une direction de 0 signifie pour télécharger une première série d'éléments de métadonnées. Comment ces données sont téléchargées sont de la responsabilité de la mise en œuvre getMoreRootElements. Cet exemple utilise la classe asynchrone, et la réponse est codée comme un tableau JSON. Pour chaque boursier trouvés, un objet est créé où le symbole est associé à une URL et ajoutés à la gamme arrTickers. Une fois le tableau arrTickers a été remplie d'éléments, la DynamicIterator. AssociateElements méthode est appelée comme suit.

 Source: / client / scripts / jaxson / uimorphing.js (DynamicIterator)associateElements: function (arrElements) (= this.arrElements arrElements; this.shiftArrayElements (0);),

La méthode associateElements fait deux choses: assigne le tableau arrElements référence et rafraîchit les données dans la page HTML en utilisant la méthode shiftArrayElements. Si l'utilisateur plane la souris sur la flèche soit à gauche ou à droite, la liste des bannières décale vers la gauche ou la droite.

Le mouvement de l'indice est contenu dans la méthode shiftArrayElements. L'appelant de la méthode donne le sens du déplacement en utilisant une valeur positive ou négative. Sur la base de la valeur directionnelle, l'indice sera décalé. Si l'indice déplacé va au-delà des limites du tableau, alors plus d'éléments de métadonnées doivent être récupérées. La pleine application de shiftArrayElements est la suivante.

 Source: / client / scripts / jaxson / uimorphing.js (DynamicIterator)shiftArrayElements: function (offset) (this.currOffset = this.currOffset + offset; if (this.currOffset <0) (this.getMoreRootElements (-1); this.currOffset = 0;) else if ((this.currOffset + ce . parentRow.cells.length)> = this.arrElements.length) (this.getMoreRootElements (1); this.currOffset = this.arrElements.length - this.parentRow.cells.length;) for (var counter = 1; counter <(this.parentRow.cells.length - 1); counter + +) (this.parentRow.cells [counter]. innerHTML = this.arrElements [this.currOffset + compteur - 1]. texte; this.parentRow.cells [ counter]. refElemInfo = this.arrElements [this.currOffset + compteur - 1];)),

Dans la mise en œuvre de shiftArrayElements, un calcul du transfert exige un test pour déterminer si le changement entraîne un saut au-delà des limites du tableau. Si un saut vers la gauche ou la droite du tableau des limites qui se passe, alors la méthode est appelée getMoreRootElements, où la valeur -1 ou 1 direction précise à préfixe de métadonnées pour le début du tableau ou ajouter des données à la fin du tableau, respectivement. Si le changement ne provoque pas un saut au-delà des limites du tableau, alors les éléments d'utilisateurs individuels HTML sont redessinée avec nouvelles informations de référence attachée à la propriété refElemInfo. Il n'est pas habituel de joindre vos données propres à un individu HTML élément d'interface utilisateur, mais dans ce cas il est absolument nécessaire pour des raisons de le faire avec un utilisateur plané la souris sur l'élément.

Si l'utilisateur plane la souris sur une réglette, vous souhaitez que les informations ticker à charger dans la fenêtre iframe flottante. Ceci est accompli par la méthode DynamicIterator.HightlightItem, qui est défini comme suit.

 Source: / client / scripts / jaxson / uimorphing.js (DynamicIterator)highlightItem: function (elem) (if (this.lastElem! = null) (this.shrinkElement (this.lastElem);) this.expandElement (elem); this.lastElem = elem; this.fetch (elem.refElemInfo);) ,

highlightItem ne fait que déléguer les actions à la shrinkElement, expandElement et aller chercher des méthodes. Toutes ces méthodes sont par défaut les fonctions vides que la page HTML doit mettre en œuvre. L'idée de highlightItem est de fournir un schéma de navigation Clickless. Comment vous rendre la fonction de navigation est de la responsabilité de la page HTML. DynamicIterator responsabilité est la coordination. Donc, la première étape consiste à redimensionner retour à la normale le dernier élément qui a été mis en évidence en utilisant la méthode shrinkElement. Dans le cas de l'exemple boursier, il est mis en oeuvre comme suit.

 Source: / client / articles ajaxrest / architecture / dynamiclist.html DynamicIterator.shrinkElement = function (elem) (elem.style.fontSize = 12;)

La mise en œuvre ticker est simple en ce qu'elle se contracte la police de la cellule du tableau arrière à 12. Amore Pour l'interface utilisateur sophistiquée, le rétrécissement de l'élément pourrait avoir signifié la fermeture d'un menu ou un pop-up élément div. La prochaine étape de highlightItem est de souligner l'élément courant en utilisant la fonction expandElement, qui est mis en oeuvre comme suit.

 Source: / client / articles ajaxrest / architecture / dynamiclist.html DynamicIterator.expandElement = function (elem) (elem.style.fontSize = 30; var = FactoryHttp.getCachedAsynchronous asynchrone (); asynchronous.settings = (onComplete: function (xmlhttp) () ) asynchronous.get (elem.refElemInfo.url);)

La mise en œuvre expandElement fait deux choses: augmente la taille de la police et télécharge les données associées à l'élément de métadonnées. Toutefois, dans l'application de onComplete, il n'y a pas d'action, parce que quand vous mettez en surbrillance l'élément de métadonnées, vous n'êtes probablement pas intéressés à l'affichage des données, mais vous êtes intéressé par la mise en cache des données pour référence ultérieure rapide. À ce stade, vous avez besoin pour prendre une décision sur le mécanisme d'afficher les données dans le iframe. Si vous souhaitez afficher les données en utilisant un simple clic, vous avez besoin pour mettre en œuvre onclick pour les cellules du tableau individuel. Si vous souhaitez utiliser l'acte de mettre en évidence comme l'élément déclencheur pour afficher les données, puis vous devez implémenter la méthode onComplete que je viens de dire n'a pas besoin d'être mises en œuvre. Mon point est que la manière d'afficher les données dépend de vous , et DynamicIterator définit pas de cadre. DynamicIterator n'est responsable que de précharger les données. Certains lecteurs mai pense que la récupération de données à chaque fois qu'un élément de métadonnées est en surbrillance est très cher, mais le coût dépend de comment vous avez mis en oeuvre votre cache. Cela signifie que chaque fois que asynchrone est référencée, la première chose qu'il ne fait que vérifier le cache de l'information. Si l'information est déjà disponible, la méthode onComplete est appelé directement. La magie réside dans la mémoire cache, et si il n'ya pas de cache, puis à chaque fois l'élément de métadonnées est en surbrillance, les données associées à la ressource sera chargé.

Portez votre regard en arrière et réfléchir à la mise en œuvre de l'architecture client-côté et la façon dont il résout notre problème d'ensembles de données volumineux et lent. Si nous devions travailler avec une application de messagerie, puis les métadonnées seraient les titres électroniques individuels, et nous aimerions la répéter sur les titres et les mettre en surbrillance. Pour vérifier les nouveaux emails, nous avons pu essaimer un thread qui ajoute automatiquement les éléments de métadonnées à la fin du tableau arrElements le. Comme nous l'itération sur les titres email, leur contenu sera téléchargé et affiché dans la fenêtre iframe. Maintenant, disons que nous étions calcul de l'ensemble des nombres premiers et a voulu voir les résultats. Dans ce cas, les métadonnées sont des données et, comme l'application de messagerie, un fil serait essaimé à continuer d'ajouter des résultats à l'ensemble arrElements. J'ai mentionné ces deux exemples de fils étant scission, parce que jusqu'à cet exemple illustre que le l'expansion et le chargement des données lorsque l'utilisateur le demande. Utilisant des fils de JavaScript, les données sont chargées automatiquement sans avoir à l'utilisateur le demander.

un article présenté par Sonja Lande


Disclaimer:Notre site n'est pas responsable du contenu de cet article. Webarticles est une ressource d'information gratuite.
Important: Cet article «multithreading en JavaScript" a été traduit par un logiciel automatique. Nous nous sentons désolés pour les fautes d'orthographe que mai ont eu lieu. Nous vous remercions de votre compréhension.


Online: 471 users browsing the articles directory