2013-01-24 19 views
21

Perché continuo a ricevere questo errore?Uncaught ReferenceError: importScripts non definito

Dovrei essere in grado di utilizzare questa funzione globale, giusto?

http://www.html5rocks.com/en/tutorials/workers/basics/

sto usando Chrome.

sto usando https://code.google.com/p/bitjs/ ed inizia con

importScripts('io.js'); 
importScripts('archive.js'); 
+0

Come si genera l'operatore? – Bergi

+0

Pensavo che questo avrebbe generato un lavoratore? Questo è il modo in cui lo usano in https://code.google.com/p/bitjs/source/browse/unzip.js – netigger

+0

No, questo deve essere all'interno di uno script di lavoro. Vedere https://code.google.com/p/bitjs/source/browse/archive.js#278 su come lo fanno, o seguire le esercitazioni che hai collegato – Bergi

risposta

10

Questo codice ha bisogno di essere all'interno di uno script operaio. L'operatore stesso viene creato tramite un nuovo oggetto Worker - vedere Getting Started in the tutorial.

Il codice che hai collegato è all'interno dell'operatore creato here.

6

Ho riscontrato anche questo errore. Nel mio caso, è perché sto testando il codice usando Karma/Jasmine. A causa del framework di test, il file worker.js viene caricato anche dal thread principale.

Ho evitato questo errore Wrappig il file worker.js con:

if('undefined' === typeof window){ 
     importScripts('workerscript2.js'); 
    ... 
    } 

prega di fare riferimento al commento qui sotto da Rob, che offre una soluzione alternativa.

+0

Questa è una soluzione intelligente quando si utilizza Jasmine. +1 – Liam

+4

Considera invece l'uso di ''function' === typeof importScripts'. –

20

Quando si crea un lavoratore, viene effettivamente eseguito due volte. Il primo passaggio è nel contesto dell'oggetto globale 'finestra' (che significa che hai accesso a tutte le funzioni dell'oggetto finestra). La seconda chiamata attraverso è nel contesto del lavoratore che ha un oggetto globale diverso, uno in cui esiste "importScripts".

// proper initialization 
if('function' === typeof importScripts) { 
    importScripts('script2.js'); 
    addEventListener('message', onMessage); 

    function onMessage(e) { 
    // do some work here 
    }  
} 

Si noti che addEventListener si trova all'interno dell'istruzione if. Se lo posizioni al di fuori di esso, il tuo callback verrà registrato due volte. Una volta sulla 'finestra' globale e una volta sul globale del lavoratore.

Felice codifica!

+3

la tua risposta ha un senso. puoi per favore indicarmi alcuni link per saperne di più sulla doppia esecuzione. – lokeshjain2008

Problemi correlati