È JavaScript multithreading?

Ecco il mio problema: io ho bisogno di scaricare dinamicamente diversi script utilizzando jQuery.getScript() e l’esecuzione di determinati JavaScript codice dopo tutti gli script che sono stati caricati, quindi il mio piano era di fare qualcosa di simile a questo:

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()  
    })
  }
}

Questo solo funziona in modo affidabile se si assume che script.eventi onload per ogni script di incendio e di eseguire in sequenza e in modo sincrono, così non ci sarà mai una situazione in cui due o più gestori di eventi sarebbe passata controllare (len == 0) ed eseguire il metodo di callback.

Quindi la mia domanda è che l’assunzione corretta e se non, qual è il modo per ottenere quello che sto cercando di fare?

  • javascript è multithread, heres un link per verificare mostrare un esempio: ajaxian.com/archives/multi-threaded-javascript
  • che non è esattamente a destra. Come il Sole ingegnere citato nell’articolo dice, Rhino motore JavaScript “consente Java chiamate di metodo. Così, è possibile creare script wrapper per la piattaforma Java classi… ci si può facilmente creare il thread in script.”
  • async.js è grande per l’esecuzione di codice dopo tutto lo script, eseguire in parallelo o in sequenza, sono stati completati
InformationsquelleAutor Andrey | 2009-11-02

 

9 Replies
  1. 80

    No, JavaScript non è multi-threaded. È event driven e la vostra assunzione di eventi di cottura in sequenza (supponendo che il carico in modo sequenziale) è ciò che si vedrà. Implementazione corrente appare corretta. Credo di jQuery .getScript() inietta un nuovo <script> tag, che dovrebbero costringerli a carico nell’ordine corretto.

    • Io, fondamentalmente, non importa se l’ordine di caricamento, ho solo bisogno di assicurarsi che la mia funzione di callback viene solo eseguito quando tutti gli script vengono caricati, perché dipende da tutti.
    • Questo è probabilmente un imbarazzante semplici domande, ma se JavaScript non è multi-threaded, perché non più incatenato jQuery animazioni (per esempio) sembrano accadere contemporaneamente invece che in sequenza?
    • L’animazione aggiornamenti vengono attivati da eventi timer di essere licenziato.
    • Da quanto ho capito, le animazioni sono di utilizzo dei timer, e ogni animazione non è un singolo processo, ma una sequenza di piccole modifiche incrementali su qualche evento timer, quindi sembra più animazioni accadere simultaneamente
    • Capito, grazie Jacob & Andrey.
  2. 34

    Attualmente JavaScript non è multithread, ma le cose cambieranno nel prossimo futuro. C’è un cosa nuova in HTML5 chiamato Lavoratore. Esso permette di fare qualche lavoro in background.

    Ma, al momento, non è supportato da tutti i browser.

  3. 16

    Il JavaScript (ECMAScript) specificazione non definisce alcun filettatura o i meccanismi di sincronizzazione.

    Inoltre, i motori JavaScript nel nostro browser sono volutamente single-threaded, in parte perché permette a più di un thread dell’interfaccia utente di operare contemporaneamente avrebbe aperto un enorme barattolo di vermi. Così la vostra assunzione e l’attuazione corretta.

    Come una nota a margine, un altro commentatore accennato al fatto che qualsiasi JavaScriptengine venditore potrebbe aggiungere la filettatura e la funzionalità di sincronizzazione, o un fornitore che potrebbe consentire agli utenti di implementare queste funzioni, come descritto in questo articolo: Multi-threaded JavaScript?

    • Sono sempre impressionato con una risposta che va per la spec. ps. (sinceramente, non è sarcasmo)
  4. 12

    JavaScript non è assolutamente multithreading – si dispone di una garanzia che qualsiasi gestore che si utilizza non sarà interrotto da un altro evento. Altri eventi, come il click del mouse, XMLHttpRequest restituisce, e temporizzatori in coda, mentre il codice è in esecuzione ed eseguire uno dopo l’altro.

  5. 10

    No, tutti i browser dare un solo thread per JavaScript.

    • +1, anche se si poteva fare altrimenti, ma per il caos che ne sarebbe derivato.
  6. 3

    Per essere chiari, il browser JS attuazione è non multithreading.

    Il lingua, JS, può essere multi-threaded.

    La questione non si applica qui.

    Ciò che vale è che getScript() è asincrona (restituisce immediatamente in coda), tuttavia, il browser verrà eseguito DOM allegato <script> contenuto in sequenza in modo che il vostro dipendente codice JS li vedono caricati in sequenza. Questa è una funzione del browser e non dipendente dalla JS filettatura o il getScript() chiamata.

    Se getScript() recuperati script con xmlHTTPRequest, setTimeout(), websockets o qualsiasi altra chiamata asincrona quindi il tuo script non sarebbe garantita da eseguire in ordine. Tuttavia, il callback sarebbe ancora chiamato dopo tutti gli script, eseguire poiché il contesto di esecuzione del tuo ‘len’ variabile è una chiusura che persiste è il contesto attraverso chiamate asincrone di una funzione.

  7. 1

    Pensato che potrebbe essere interessante provare questo fuori con un “costretto“, in ritardo di script consegna …

    1. aggiunto due script disponibili da
      google
    2. aggiunto delayjs.php come il 2
      elemento di matrice. delayjs.php posti letto
      per 5 secondi prima di consegnare un vuoto js
      oggetto.
    3. aggiunto un callback che
      verifica” l’esistenza di
      previsti gli oggetti dallo script
      i file.
    4. aggiunto un paio di js comandi
      vengono eseguite sulla linea dopo il
      GetScripts() chiamata, per “test” sequenziale comandi js.

    Il risultato con lo script di carico come previsto; la callback viene attivato solo dopo l’ultimo script è caricato. Quello che mi ha sorpreso è che il js comandi che ha seguito il GetScripts() chiamata attivato senza la necessità di attendere l’ultimo script per caricare. Ero sotto l’impressione che non js comandi dovrebbe essere eseguito mentre il browser è in attesa di un js script per caricare …

    var scripts = [];
    scripts.push('http://ajax.googleapis.com/ajax/libs/prototype/1.6.1.0/prototype.js');
    scripts.push('http://localhost/delayjs.php');
    scripts.push('http://ajax.googleapis.com/ajax/libs/scriptaculous/1.8.3/scriptaculous.js');
    
    
    function logem() {
        console.log(typeof Prototype);
        console.log(typeof Scriptaculous);
        console.log(typeof delayedjs);
    }
    
    GetScripts( scripts, logem );
    
    console.log('Try to do something before GetScripts finishes.\n');
    $('#testdiv').text('test content');
    
    <?php
    
    sleep(5);
    echo 'var delayedjs = {};';
    • Beh, non confondere te stesso browser download script al di fuori di javascript thread, quindi javascript procede senza aspettare gli script per caricare
  8. 0

    Probabilmente si può ottenere un qualche tipo di multithreadedness se si crea un numero di fotogrammi in un documento HTML, ed eseguire uno script in ognuno di loro, ogni chiamata di una funzione nel telaio principale, che dovrebbe dare un senso ai risultati di tali funzioni.

Lascia un commento