1

目前我有以下代码:

这是在我的 HTML 文档中。

<script language="JavaScript" type="text/javascript" src="workerTest.js"></script>

现在根据我的理解和研究,工人必须来自外部文件。

所以在我的workerTest.js中我有

var iWorker = new Worker('workerTest.js');

我更愿意在我的 workerTest.js 中声明我的所有作品和代码,并能够从外部文件中创建它们。

所以像

var iWorker2 = new Worker('scripttagid');

显然上面的代码是错误的,但我希望它能说明我的观点。

这可能吗?如果有人可以指出我正确的方向吗?可能是一些示例代码?

如果这不可能,那么避免大量工作文件的最佳方法是什么。因为会有很多作品。

4

3 回答 3

2

嗯,有点:

<!-- won't be executed by browser because of the invalid type -->
<script type="text/worker" id="worker-code">
while(true) {

}
</script>

Javascript:

var workerCode = document.getElementById("worker-code").innerHTML;
//Could also just be var workerCode = 'while(true){}';

var BlobBuilder = window.WebKitBlobBuilder || window.MozBlobBuilder || window.OBlobBuilder || window.BlobBuilder,
    blobBuilder = new BlobBuilder(),
    URL = window.webkitURL || window.URL,
    blob, workerURL;

blobBuilder.append(workerCode);
blob = blobBuilder.getBlob("text/javascript");

workerURL = URL.createObjectURL( blob );
var iWorker = new Worker(workerURL);

请注意,您也不需要该元素,只是将代码存储在字符串'while(true){}'中很难维护。

演示: http: //jsfiddle.net/pmSSf/(处理器使用率会飙升,但您可以使用该页面,因为它不在 UI 线程中运行)

于 2012-07-30T20:12:14.030 回答
0

此外,从这些文档中,我发现您可以加载外部脚本,或者实现 subworkers 或 inline workers。

内联工作者使用 Esailija 描述的 BlobBuilder 技术。

引用:

加载外部脚本

您可以使用 importScripts() 函数将外部脚本文件或库加载到工作程序中。该方法采用零个或多个字符串来表示要导入的资源的文件名。

此示例将 script1.js 和 script2.js 加载到 worker 中:

工人.js:

importScripts('script1.js');
importScripts('script2.js');

也可以写成一个单独的 import 语句:

importScripts('script1.js', 'script2.js');

子工

工人有能力产生童工。这对于在运行时进一步分解大型任务非常有用。但是,subworker 有一些注意事项:

子工作者必须托管在与父页面相同的源中。subworkers 中的 URI 是相对于其父 worker 的位置(而不是主页)进行解析的。请记住,大多数浏览器为每个工作人员生成单独的进程。在你去生成一个工人农场之前,要小心不要占用太多的用户系统资源。造成这种情况的一个原因是在主页面和工作人员之间传递的消息是复制的,而不是共享的。请参阅通过消息传递与工作人员通信。

有关如何生成 subworker 的示例,请参阅规范中的示例。

在线工人

如果您想即时创建工作脚本,或者创建一个独立的页面而不需要创建单独的工作文件,该怎么办?使用新的 BlobBuilder 接口,您可以通过创建 BlobBuilder 并将工作程序代码作为字符串附加到与主逻辑相同的 HTML 文件中“内联”工作程序:

于 2012-07-30T20:21:27.537 回答
0

你可以使用我的小插件https://github.com/zevero/worker-create

var worker_url = Worker.create(function(e){
  self.postMessage('Example post from Worker'); //your code here
});
var worker = new Worker(worker_url);
于 2015-10-18T12:56:28.337 回答