2013-01-24 11 views
21

Dlaczego ciągle pojawia się ten błąd?Niepowodzenie ReferenceError: importScripts nie jest zdefiniowany

Powinienem móc korzystać z tej funkcji globalnej, prawda?

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

używam Chrome.

Używam https://code.google.com/p/bitjs/ i zaczyna z

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

Jak odradza się pracownika? – Bergi

+0

Myślałem, że to spawn pracownika? Oto, jak używają tego w https://code.google.com/p/bitjs/source/browse/unzip.js. – netigger

+0

Nie, musi to być wewnątrz skryptu roboczego. Zobacz https://code.google.com/p/bitjs/source/browse/archive.js#278, jak to robią, lub skorzystaj z samouczków, które podłączyłeś. – Bergi

Odpowiedz

10

Kod ten musi być wewnątrz skryptu pracowników. Sam robot jest tworzony przez nowy obiekt Worker - patrz Getting Started in the tutorial.

Kod, który podłączyłeś, znajduje się wewnątrz utworzonego pliku here.

6

Napotkano również ten błąd. W moim przypadku dzieje się tak, ponieważ testuję kod za pomocą Karma/Jasmine. Ze względu na strukturę testową plik worker.js jest również ładowany przez główny wątek.

unikałem tego błędu przez wrappig plik worker.js z:

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

Proszę odnieść się do komentarza poniżej Roba, który oferuje alternatywne rozwiązanie.

+0

To sprytne obejście podczas korzystania z Jasmine. +1 – Liam

+4

Rozważ użycie '' function '=== typeof exportScripts' zamiast tego. –

20

Po utworzeniu pracownika jest on faktycznie wykonywany dwukrotnie. Pierwsze przejście jest w kontekście globalnego obiektu "okno" (co oznacza, że ​​masz dostęp do wszystkich funkcji obiektu okna). Drugie wywołanie znajduje się w kontekście elementu roboczego, który ma inny obiekt globalny, taki, w którym istnieje "importScripts".

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

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

Uwaga: addEventListener znajduje się wewnątrz instrukcji if. Jeśli umieścisz go poza nim, twoje wywołanie zwrotne zostanie zarejestrowane dwukrotnie. Raz w "oknie" globalnym i raz w świecie pracownika.

Szczęśliwe kodowanie!

+3

Twoja odpowiedź ma sens. czy możesz wskazać mi jakieś linki, aby dowiedzieć się więcej o podwójnej egzekucji. – lokeshjain2008

Powiązane problemy