Multithreading in JavaScriptImitando Multithreading in JavaScript Un evento proattiva-Driven Architecture è come il cane che chiede (se potesse), "Quando hai intenzione di lanciare la palla, al momento, eh, quando?" La pseudo-architettura thread è implementato utilizzando timeout. La pseudo-thread è il risultato di una funzione periodica o chiamate il numero oggetto e l'implementazione completa è mostrato nel seguente codice sorgente. Fonte: / client / scripts / jaxson / Common.js ThreadObject function () (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 );)) Thread var = (threadObjects: new Array (), StartThread: function (obj, dati, tempo) (for (var c1 = 0; c1 <this.threadObjects.length; c1 + +) (if (! questo . threadObjects [C1]. isUsed) (this.threadObjects [C1]. isUsed = true; this.threadObjects [C1]. data = dati; this.threadObjects [C1]. obj = obj; this.threadObjects [C1]. intervalId = window.setInterval ( "Thread.threadObjects [" + c1 + "]. makeCall ()", tempo); this.threadObjects return [C1]. intervalId;)) throw new Error ( "Impossibile avviare 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]. isUsed = false;)))) InitializeThreads function (MaxThreads) (for (var c1 = 0; c1 <MaxThreads; c1 + +) (Thread.threadObjects.push (nuovo ThreadObject ()); )) InitializeThreads (30); Nella fonte, due tipi di oggetto sono definite: ThreadObject e Thread. Il tipo di ThreadObject è utilizzato per gestire i thread finta, e Thread gestisce i fili in giro. La funzione InitializeThreads viene utilizzata per impostare la pseudo-threading ambiente. Per spiegare questo codice sorgente, un approccio top-down viene utilizzato. Quando il file JavaScript che contiene la pseudo-architettura thread viene caricato, la funzione InitializeThreads viene chiamata con un valore di parametro di 30. InitializeThreads viene utilizzato per inizializzare la matrice di pseudo-thread che sarà chiamato. Hard-codifica per un limite di 30 thread può sembrare una cattiva pratica di programmazione, ma c'è una ragione per questo. Per creare una pseudo-thread, si crea un evento periodico, il che significa che è necessario utilizzare il window.setInterval o window.setTimeout metodo. Chiamando uno di questi metodi richiede una funzione di riferimento o un pezzo di codice JavaScript. Il problema con i due approcci è che è necessario per serializzare il codice sorgente. Ad esempio, immaginare che si desidera chiamare uno dei metodi periodico evento con un inst locale riferimento a un oggetto, come illustrato dal seguente codice: window.setInterval ( "CallFunction (inst)", 300);
Il riferimento a inst nel buffer di stringa non avrà alcun senso, perché quando il timer esegue periodici, variabili locali non sono nel loro contesto. L'esecuzione si tradurrà in un errore. Un altro modo per chiamare la funzione è quella di serializzare inst a un buffer, ma che ha lo svantaggio che lo stato usato in caso di mora non sarà la stessa istanza dell'oggetto, quindi eventuali modifiche apportate tra la chiamata della funzione setInterval e la scadenza del timer, non sarà presente. L'unico momento in inst è valido se inst è una variabile globale. Come regola generale, il modo più sicuro di fare un contesto metodo specifico chiamata utilizzando i metodi setInterval o setTimeout è quello di utilizzare un punto di riferimento a livello mondiale. Un riferimento a livello mondiale può essere creato in modo dinamico un'istanza di variabili casuali o utilizzando un riferimento a un indice di array. L'approccio scelto dalla Thread è l'indice di array. InitializeThreads La funzione inizializza 30 referenze a livello mondiale di ThreadObject. Ogni ThreadObject ha quattro membri di dati: • obj: riferimento all'oggetto da eseguire. Il metodo ThreadObject.makeCall in grado di distinguere tra una funzione e l'oggetto. Se obj è una funzione, allora obj sarà chiamato con una notazione funzione. Se obj è un'istanza di un oggetto, quindi il metodo obj.run viene chiamato. • dati: riferimenti i dati utilizzati come un contesto in cui obj viene eseguito. • intervalId: fa riferimento al valore restituito dal metodo window.setInterval. Questo valore è usato per fermare la manifestazione periodica. Fonte: / client / scripts / jaxson / uimorphing.js (DynamicIterator)intervalId: 0, startIteration: function (direzione) (this.intervalId = Thread.startThread (function (direzione) (DynamicIterator.shiftArrayElements (direzione);), direzione, 500);), StopIteration: function () (Thread.endThread ( this.intervalId);), Mettere i pezzi residui del Cliente Together Diverse volte ho fatto riferimento all'attuazione DynamicIterator, che viene utilizzato per navigare i metadati del set di risultati. Il ruolo principale di DynamicIterator è quello di caricare gli elementi di metadati di navigazione, e quando i singoli elementi sono referenziati, i principali dati che viene caricato. Spiego l'attuazione del DynamicIterator in pezzi, con la seguente rappresentazione del inizializzazione degli elementi di navigazione. Fonte: / 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. document.body.clientHeight = altezza - 104;), / / Altre dichiarazioni ...);
Tornando agli inizi della "Attuare il HTML Client sezione", ricorda il pezzo di codice HTML che ha implementato l'evento body.onload, che ha chiesto la funzione locale Initialize. Per l'attuazione del Initialize, il metodo DynamicIterator.initialize viene chiamato. DynamicIterator.initialize si chiama cross-reference gli elementi dell'interfaccia utente HTML con l'istanza DynamicIterator. DynamicIterator.initialize prevede due elementi di interfaccia utente HTML: l'iframe galleggiante (this.floatingIframe) e la riga della tabella (this.parentRow) che contiene gli elementi di navigazione. DynamicIterator bisogno di questi due elementi dell'interfaccia utente, perché carichi i dati evidenziati nella zona di navigazione. Dopo gli elementi dell'interfaccia utente sono stati assegnati ai membri di dati, il metodo doLayout viene chiamato. Lo scopo di doLayout è quello di ridimensionare l'iframe in modo che copra l'area client appropriata. E la chiamata al metodo ultimo DynamicIterator.initialize è la chiamata del metodo getMoreRootElements, che è responsabile per il caricamento degli elementi di metadati di navigazione. Nel contesto della DynamicIterator, il metodo getMoreRootElements viene dichiarato come una funzione vuota simile al seguente: getMoreRootElements: function (direzione) () La funzione vuota è un segnaposto, e si prevede che il codice HTML dichiarerà l'implementazione. Nel caso del codice HTML, getMoreRootElements è definito come segue. Fonte: / client / articles ajaxrest / architettura / DynamicIterator.getMoreRootElements dynamiclist.html = function (direzione) (if (direzione == 0) (var asincrono = FactoryHttp.getCachedAsynchronous (); asynchronous.settings = (onComplete: function (xmlhttp) (var arrTickers = new Array (); ticker var = JSON.parse (xmlhttp.responseText); for (var c1 = 0; c1 <tickers.length; c1 + +) (arrTickers.push ((text: tickers [C1], url : "/ pyservices / operatore / storico / ticker /" + tickers [C1]));) DynamicIterator.associateElements (arrTickers);)) asynchronous.get ( "/ pyservices / operatore / storico / ticker");)) Nel caso del codice HTML, il ticker che rappresentano i metadati utilizzati per navigare attraverso l'applicazione vengono caricati una volta. I metadati possono essere illimitata, ma spesso può essere limitato a una dimensione fissa insieme, anche se tale dimensione set è molto grande. Guardando l'esempio, ogni pezzo di metadati è un ticker che può avere uno di quattro lettere (in media). Se si moltiplica il numero di 1.000 righe, allora dovete scaricare circa 4KB-5KB di dati (in questa epoca di banda larga , il download di 4KB-5KB è banale). L'applicazione di stock permetterà al massimo 50 righe a causa di limitazioni tecniche, così tutte le righe può essere scaricato in una sola richiesta. Nel caso del nostro esempio, getMoreRootElements con una direzione di 0 significa che per scaricare una prima serie di elementi di metadati. Come che i dati vengono scaricati è la responsabilità della realizzazione getMoreRootElements. In questo esempio viene utilizzata la classe asincrona, e la risposta è codificato come un array JSON. Per ogni ticker trovato, viene creato un oggetto in cui il ticker è combinata con un URL e aggiunti alla matrice arrTickers. Una volta che l'array arrTickers è stato riempito con elementi, la DynamicIterator. AssociateElements viene chiamato il metodo come segue. Fonte: / client / scripts / jaxson / uimorphing.js (DynamicIterator)associateElements: function (arrElements) (this.arrElements = arrElements; this.shiftArrayElements (0);), Il metodo associateElements fa due cose: assegna la matrice arrElements di riferimento e aggiorna i dati nella pagina HTML utilizzando il metodo shiftArrayElements. Se l'utente passa il mouse sopra o la freccia a destra oa sinistra, l'elenco di righe si sposta verso sinistra o verso destra. Il movimento indice è contenuta all'interno del metodo shiftArrayElements. Il chiamante del metodo fornisce la direzione dello spostamento utilizzando un valore positivo o negativo. Sulla base del valore direzionale, l'indice sarà spostato. Se l'indice spostato va oltre i confini della matrice, quindi più elementi di metadati devono essere recuperate. La piena attuazione di shiftArrayElements è il seguente. Fonte: / 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 + questo . 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 + counter - 1]. testo; this.parentRow.cells [ counter]. refElemInfo = this.arrElements [this.currOffset + counter - 1];)), Per l'attuazione del shiftArrayElements, un calcolo del cambiamento richiede un test per determinare se lo spostamento causerà un salto al di là dei confini della matrice. Se un salto a sinistra oa destra dei confini matrice accade, allora il metodo getMoreRootElements viene chiamato, in cui il valore -1 o 1 direzione precisa al prefisso metadati per l'inizio della matrice o aggiungere dati alla fine dell'array, rispettivamente. Se il passaggio non causa un salto al di là dei confini della matrice, poi i singoli elementi HTML dell'utente sono ridisegnati con nuove informazioni di riferimento collegato alla proprietà refElemInfo. Non è usuale per collegare i propri dati ad un elemento HTML singoli interfaccia utente, ma in questo caso è assolutamente necessario, per motivi a che fare con un utente passare il mouse sopra l'elemento. Se l'utente posiziona il mouse su un ticker, si desidera che le informazioni ticker per essere caricato nella finestra mobile iframe. Questa operazione viene eseguita con il metodo DynamicIterator.HightlightItem, che è definito come segue. Fonte: / 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 non fa altro che delegare le azioni al shrinkElement, expandElement e metodi di recupero. Tutti questi metodi sono le funzioni di default vuoto che la pagina HTML deve attuare. L'idea di highlightItem è quello di fornire uno schema clickless navigazione. Come si effettua la funzione di navigazione è di competenza della pagina HTML. DynamicIterator responsabilità è il coordinamento. Pertanto, il primo passo è quello di ridimensionare torna alla normalità l'ultimo elemento che è stato messo in evidenza con il metodo shrinkElement. Nel caso dell'esempio ticker, è implementato come segue. Fonte: / client / articles ajaxrest / architettura / dynamiclist.html DynamicIterator.shrinkElement = function (elem) (elem.style.fontSize = 12;) L'attuazione ticker è semplice, in quanto riduce il carattere della cella della tabella indietro a 12. Per amore sofisticata interfaccia utente, riducendo l'elemento avrebbe potuto significare la chiusura di un menu o una finestra pop-up elemento div. Il prossimo passo di highlightItem è quello di evidenziare l'elemento corrente utilizzando la funzione expandElement, che viene realizzato come segue. Fonte: / client / articles ajaxrest / architettura / dynamiclist.html DynamicIterator.expandElement = function (elem) (elem.style.fontSize = 30; var asincrono = FactoryHttp.getCachedAsynchronous (); asynchronous.settings = (onComplete: function (xmlhttp) () ) asynchronous.get (elem.refElemInfo.url);) L'attuazione expandElement fa due cose: aumenta la dimensione del carattere e il download dei dati associati con l'elemento di metadati. Tuttavia, l'attuazione di onComplete, non c'è azione, perché quando si evidenzia l'elemento di metadati, che probabilmente non sono interessati a visualizzare i dati, ma si è interessati al caching dei dati per un rapido riferimento futuro. A questo punto, è necessario prendere una decisione circa il meccanismo di visualizzare i dati nel iframe. Se si desidera visualizzare i dati utilizzando un clic, allora è necessario implementare onclick per le singole celle della tabella. Se si desidera utilizzare l'atto di mettere in evidenza come il grilletto per visualizzare i dati, quindi è necessario implementare il metodo onComplete che ho appena detto non ha bisogno di essere attuato. Il punto è che il modo di visualizzare i dati a voi , e DynamicIterator definisce un quadro. DynamicIterator è responsabile solo per il precaricamento dei dati. Alcuni lettori potrebbero pensare che il recupero di dati ogni volta che un elemento di metadati è messo in evidenza è molto costoso, ma il costo dipende da come si implementato la cache. Ciò significa che ogni volta che asincrono si fa riferimento, la prima cosa che non fa altro che controllare la cache per le informazioni. Se le informazioni sono già disponibili, il metodo onComplete viene chiamato direttamente. La magia sta nella cache, e se non c'è cache, quindi ogni volta che l'elemento di metadati è evidenziato, i dati associati con la risorsa verrà caricata. Facciamo un passo indietro e pensare l'attuazione della architettura client-side e come si risolve il nostro problema di grandi insiemi di dati o lento. Se stavamo lavorando con un'applicazione di posta elettronica, i metadati sarebbero i titoli individuali e-mail, e noi scorrere i titoli ed evidenziare loro. Per controllare le email, si potrebbe spin-off di un thread che aggiungere automaticamente elementi di metadati per la fine della matrice arrElements. Come abbiamo scorrere i titoli di email, il loro contenuto potrebbe essere scaricato e visualizzato nella finestra iframe. Ora diciamo che siamo stati il calcolo di tutti i numeri primi e voleva vedere i risultati. In questo caso, i metadati sono dati, e come l'applicazione di posta elettronica, un filo sarebbe scorporata per continuare ad aggiungere i risultati alla matrice arrElements. Ho citato questi due esempi di fili di essere scorporata, perché finora l'esempio illustra solo la l'espansione e il caricamento dei dati quando l'utente lo chiede. Utilizzando fili JavaScript, i dati vengono caricati automaticamente, senza che l'utente ne fanno richiesta. un articolo presentato da Sonja Lande Disclaimer:Il nostro sito non è responsabile per il contenuto di questo articolo. Webarticles è una risorsa gratuita di informazioni. Importante: Questo articolo "Multithreading in JavaScript" è stato tradotto da un software automatico. Ci dispiace per eventuali errori di ortografia che possono essersi verificati. Grazie per la vostra comprensione.
|
|||||
| Online: 194 users browsing the articles directory |
|
|