2013-01-24 124 views
21

爲什麼我一直收到此錯誤?未捕獲的ReferenceError:未定義importScripts

我應該可以使用這個全局函數嗎?

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

我使用鉻。

我使用https://code.google.com/p/bitjs/並將其與

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

你如何培育工人? – Bergi

+0

以爲這會產生一個工人?這是他們在https://code.google.com/p/bitjs/source/browse/unzip.js中的使用方式 – netigger

+0

不,這需要在工作人員腳本中。請參閱https://code.google.com/p/bitjs/source/browse/archive.js#278關於他們如何操作的信息,或者按照您鏈接的教程 – Bergi

回答

10

此代碼需要一個工人腳本中開始。工作人員本身是通過一個新的Worker對象創建的 - 請參閱Getting Started in the tutorial

您鏈接的代碼位於創建者here內。

6

我也遇到了這個錯誤。就我而言,這是因爲我正在使用Karma/Jasmine測試代碼。由於測試框架,worker.js文件也由主線程加載。

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

請參考下面的評論羅布,它提供了一個可選的解決方案:

我用wrappig的worker.js文件避免這個錯誤。

+0

這是在使用Jasmine時巧妙的解決方法。 +1 – Liam

+4

請考慮使用''function'=== typeof importScripts'。 –

20

當您創建一個工人時,它實際上會執行兩次。第一遍是在全局「窗口」對象的上下文中(意味着您可以訪問所有窗口對象函數)。第二次調用是在具有不同全局對象的worker的上下文中,其中存在'importScripts'。

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

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

注意addEventListener在if語句中。如果你把它放在它外面,你的回調將被註冊兩次。一旦進入全球「窗口」,一旦進入全球工作人員。

快樂編碼!

+3

你的回答很有意義。你能否指點一些鏈接來更多地瞭解兩次執行。 – lokeshjain2008

相關問題