43

为什么我不断收到此错误?

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

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

我正在使用铬。

我正在使用https://code.google.com/p/bitjs/它以

importScripts('io.js');
importScripts('archive.js');
4

5 回答 5

50

当您创建一个工作人员时,它实际上会执行两次。第一遍是在全局“窗口”对象的上下文中(意味着您可以访问所有窗口对象函数)。第二次调用是在具有不同全局对象的工作人员的上下文中,其中存在“importScripts”。

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

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

请注意 addEventListener 在 if 语句中。如果你把它放在外面,你的回调将被注册两次。一次在“窗口”全局上,一次在工作人员的全局上。

快乐编码!

于 2015-02-20T02:21:01.010 回答
21

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

您链接的代码在此处创建的工作人员中。

于 2013-01-24T15:25:58.083 回答
15

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

我通过将 worker.js 文件包装为以下内容来避免此错误:

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

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

于 2014-01-24T14:51:12.650 回答
2

感谢您提供避免错误的解决方案。我是新手,所以无法投票但写下来,我只是将我的线路替换importScripts('Myworkerscript.js');

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

魔法发生了,错误消失了。

于 2021-09-14T08:01:50.777 回答
1

如果是您面临的 linting 问题,您可以在包含 importScripts 的文件中添加以下注释

/* eslint-disable no-undef */
于 2021-07-01T16:03:20.587 回答