未捕获的ReferenceError:未定义importScripts

net*_*ger 30 javascript google-chrome web-worker

为什么我一直收到这个错误?

我应该可以使用这个全局函数吗?

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

我正在使用铬.

我正在使用https://code.google.com/p/bitjs/,它始于

importScripts('io.js');
importScripts('archive.js');
Run Code Online (Sandbox Code Playgroud)

小智 31

当你创建一个worker时,它实际上被执行了两次.第一遍是在全局"窗口"对象的上下文中(意味着您可以访问所有窗口对象函数).第二个调用是在具有不同全局对象的worker的上下文中,其中存在"importScripts".

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

   function onMessage(e) { 
     // do some work here 
   }    
}
Run Code Online (Sandbox Code Playgroud)

请注意,addEventListener位于if语句中.如果将它放在它之外,你的回调将被注册两次.一旦进入'窗口'全球,一旦进入工人的全球.

快乐的编码!

  • 你的答案是有道理的.你能指点一些链接,了解更多关于两次执行的信息. (4认同)

Ber*_*rgi 18

此代码需要在worker脚本中.工作程序本身是通过新Worker对象创建的- 请参阅教程中的入门.

您链接的代码位于此处创建的工作程序中.


gm2*_*008 11

我也遇到了这个错误.在我的情况下,这是因为我正在使用Karma/Jasmine测试代码.由于测试框架,worker.js文件也由主线程加载.

我通过wrappig worker.js文件避免了这个错误:

    if( 'undefined' === typeof window){
       importScripts('workerscript2.js');
    ...
    }
Run Code Online (Sandbox Code Playgroud)

请参阅Rob下面的评论,它提供了另一种解决方案.

  • 考虑使用`'function'=== typeof importScripts`. (6认同)