HTML5之web workers_动力节点Java学院整理
Google Chrome 17 与 Firefox 18 包括另一种机能更高的要领来将特定范例的工具(可转让工具) 转达给一个 worker/从 worker 传回 。可转让工具从一个上下文转移到另一个上下文而不会颠末任何拷贝操纵。这意味着当转达大数据时会得到极大的机能晋升。假如你从 C/C++ 天下来,那么把它想象成凭证引用转达。然而与凭证引用转达差异的是,一旦工具转让,那么它在原本上下文的谁人版本将不复存在。该工具的全部权被转让到新的上下文内。譬喻,当你将一个ArrayBuffer工具从主应用转让到Worker 中,原始的ArrayBuffer被破除而且无法行使。它包括的内容会(完备无差的)转达给 Worker 上下文。 // Create a 32MB "file" and fill it. var uInt8Array = new Uint8Array(1024*1024*32); // 32MB for (var i = 0; i < uInt8Array .length; ++i) { uInt8Array[i] = i; } worker.postMessage(uInt8Array.buffer, [uInt8Array.buffer]); 天生subworker 假如必要的话 Worker 可以或许天生更多的 Worker。这样的被称为 subworker,它们必需托管在与父页面沟通的源内。同理,subworker 理会 URI 时会相对付父 worker 的地点而不是自身的页面。这使得 worker 轻易监控它们的依靠相关。 Chrome 今朝并不支持subworker。 嵌入式 worker 今朝没有一种「官方」的要领可以或许像<script>元素一样将 worker 的代码嵌入的网页中。可是假如一个<script>元素没有src 特征,而且它的type特征没有指定成一个可运行的 mime-type,那么它就会被以为是一个数据块元素,而且可以或许被 JavaScript 行使。「数据块」是 HTML5 中一个异常常见的特征,它可以携带险些任何文本范例的数据。以是,你可以或许以如下方法嵌入一个 worker: <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>MDN Example - Embedded worker</title> <script type="text/js-worker"> // 该剧本不会被 JS 引擎理会,由于它的 mime-type 是 text/js-worker。 var myVar = "Hello World!"; // 剩下的 worker 代码写到这里。 </script> <script type="text/javascript"> // 该剧本会被 JS 引擎理会,由于它的 mime-type 是 text/javascript。 function pageLog (sMsg) { // 行使 fragment:这样赏识器只会举办一次渲染/重排。 var oFragm = document.createDocumentFragment(); oFragm.appendChild(document.createTextNode(sMsg)); oFragm.appendChild(document.createElement("br")); document.querySelector("#logDisplay").appendChild(oFragm); } </script> <script type="text/js-worker"> // 该剧本不会被 JS 引擎理会,由于它的 mime-type 是 text/js-worker。 onmessage = function (oEvent) { postMessage(myVar); }; // 剩下的 worker 代码写到这里。 </script> <script type="text/javascript"> // 该剧本会被 JS 引擎理会,由于它的 mime-type 是 text/javascript。 // 在已往...: // 我们行使 blob builder // ...可是此刻我们行使 Blob...: var blob = new Blob(Array.prototype.map.call(document.querySelectorAll("script[type="text/js-worker"]"), function (oScript) { return oScript.textContent; }),{type: "text/javascript"}); // 建设一个新的 document.worker 属性,包括全部 "text/js-worker" 剧本。 document.worker = new Worker(window.URL.createObjectURL(blob)); document.worker.onmessage = function (oEvent) { pageLog("Received: " + oEvent.data); }; // 启动 worker. window.onload = function() { document.worker.postMessage(""); }; </script> </head> <body><div id="logDisplay"></div></body> </html> 此刻,嵌入式 worker 已经嵌套进了一个自界说的document.worker属性中。 超时与隔断 Worker 可以或许像主线程一样行使超时与隔断。这会异常有效,好比说,假如你想让 worker 线程周期性而并非不中断的运行代码。 终止 worker 假如你想当即终止一个运行中的 worker,可以挪用 worker 的terminate()要领: myWorker.terminate(); worker 线程会被当即杀死,不会留下任何机遇让它完本钱身的操纵或整理事变。 Workers 也可以挪用本身的nsIWorkerScope.close()要领来封锁本身: self.close(); 处理赏罚错误 当 worker 呈现运行时错误时,它的onerror变乱处理赏罚函数会被挪用。它会收到一个实现了ErrorEvent接口名为error的变乱。该变乱不会冒泡,而且可以被打消;为了防备触发默认举措,worker 可以挪用错误变乱的preventDefault()要领。错误变乱拥有下列三个它感乐趣的字段: message 可读性精采的错误动静。 filename 产生错误的剧本文件名。 lineno 产生错误时地址剧本文件的行号。 会见 navigator 工具 Workers 可以在它的浸染域内会见navigator工具。它含有如下可以或许辨认赏识器的字符串,就像在平凡剧本中做的那样: appName appVersion platform userAgent 引入剧本与库 Worker 线程可以或许会见一个全局函数,importScripts(),该函数应承 worker 将剧本或库引入本身的浸染域内。你可以不传入参数,或传入多个剧本的 URI 来引入;以下的例子都是正当的: importScripts(); /* 什么都不引入 */ importScripts('foo.js'); /* 只引入 "foo.js" */ importScripts('foo.js', 'bar.js'); /* 引入两个剧本 */ (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |