为什么不让网络工作者工作?

时间:2018-03-07 15:42:49

标签: javascript web-worker

所以,我试图在我的项目中使用Web worker来运行一个目前正在占用UI的长时间运行的进程。我去过,我不知道有多少网站试图让工人上班,但无济于事。

我的所有javascript都保存在单独的文件中,并在HTML文件中引用。作为一个让我的脚湿透的测试,我创建了一个test.js文件并将以下代码放入其中:

self.addEventListener('message', function(e) { 
self.postMessage('return');},false);

然后,在UI页面的javascript文件中,我将此代码放在由按钮点击事件触发的函数中:

var w = new Worker('test.js');
w.addEventListener('message',function(e){
alert(e.data);},false);
w.postMessage('hi');

代码源自:

html5rocks.com/en/tutorials/workers/basics

我访问过的其他网站提供了有关如何设置工作人员的类似说明。

对于我的生活,我无法让它发挥作用。当我执行它绝对没有什么,我似乎没有错误。单步执行代码,它似乎创建了工作者,但我没有看到任何关于正在创建事件监听器的证据以及“postMessage'事件没有做任何事情。我已经尝试过IE11和Chrome,效果相同。

在我的研究中,我遇到了Chrome开发人员工具的一部分,该工具显示无法找到test.js文件。但是,该文件与页面的js文件位于同一文件夹中。所以,我尝试在页面的HTML部分中添加相关目录信息。这也不起作用。

然后我发现声称出于安全原因,您无法在代码中使用一个js文件引用另一个js。目前还不清楚这是纯Chrome功能还是某些规格的一部分。

所以,现在我陷入了困境。工作者需要引用单独的js文件来执行代码,但浏览器是否不允许引用另一个文件?如果你不被允许做他们需要的工作,工人应该如何工作?

到现在为止,我已经成功地生了两天试图让这个看似简单的功能起作用。说我有点沮丧是一种轻描淡写的说法。作为一个相当新手的程序员并且不理解关于Web编程的每一个细微差别我都明显错过了这一切的关键部分。

如何让网络工作者工作?

2 个答案:

答案 0 :(得分:0)

事实证明,浏览器不允许通过javascript提取本地文件。因为这意味着网站可以读取您的个人文件!因此,您需要使用Web服务器来开发和测试项目。对我来说,最简单的方法是安装:

docker-compose

,并确保其有效。然后创建一个名为:

的文件
docker-compose.yml

在我项目的根文件夹中带有index.html文件。然后将其放入docker-compose.yml文件中:

version: '3'
services:

  nginx:
    image: nginx:alpine
    volumes:
      - .:/usr/share/nginx/html
    ports:
      - "80:80"

然后在我的项目的根文件夹中运行:

docker-compose up

然后在浏览器中转到: http://localhost/ 而且有效!

答案 1 :(得分:-2)

我似乎找到了一个解决方案,虽然它让我无法理解。

如果我使用:

 var w = new Worker('js\test.js');

工人没有工作。

但是,如果我使用:

var w = new Worker('js/test.js');

工人确实在工作。

我在整个项目中使用反斜杠来描绘路径而没有问题。为什么必须使用正斜杠来设置工作人员的文件位置是一个谜。我在任何文档中都没有看到任何内容,甚至可以远程解决那些看似微不足道的细节问题。

感谢Starke先生,感谢您的帮助!