创建一个新的 worker 十分简单。你所要做的就是调用 Worker() 构造函数,指定一个要在 worker 线程内运行的脚本的 URI,如果你希望能够收到 worker 的通知,可以将 worker 的 onmessage 属性设置成一个特定的事件处理函数。
var myWorker = new Worker("my_task.js");
myWorker.onmessage = function (oEvent) {console.log("Called back by the worker!\n");
};
停止 Worker 的方法有两种:在主网页中调用 worker terminate(),或在 Worker 本身内部调用 self.close()。
一个普通的web worker只能被创建它的页面访问。如果你想在多个页面之间共享一个web worker,你可以使用SharedWorker。SharedWorker可以被从同一个源(域)加载的所有页面访问。
SharedWorker接口代表了一种特定类型的worker,可以从几个浏览上下文访问,比如几个窗口、iframe甚至worker。他们实现了不同于dedicated worker的接口,并且具有不同的全局范围,
如果可以从多个浏览上下文访问SharedWorker,那么所有这些浏览上下文必须共享完全相同的起源(相同的协议、主机和端口)。
var worker = new SharedWorker("/html5/web-worker-shared.js");
worker.port.addEventListener("message",function(event) {alert(event.data);}, false
);
worker.port.start();
消息传递:
onconnect = function (e) {var port = e.ports[0];port.postMessage('A new connection! The current connection number is ' + connect_number);port.onmessage = function (e) {var instruction = e.data.instruction || e.data;var results = execute_instruction(instruction);port.postMessage('...');};port.start();
};
应用场景:
共享网络工作者在几年内可能不会成为一种可行的技术,但它们为JavaScript开发的未来带来了令人兴奋的机会。让我们希望浏览器供应商能够提供一些像样的跟踪和调试工具!
dedicate worker和sharedworker的区别:
Service Worker继承了HTML5 Shared Worker的所有限制和行为。它可以创建xmlhttprequest,使用WebSockets,从窗口和浏览器接收消息,使用IndexedDB,并将消息发布到其他窗口。
Service worker预计将在全局范围内提供一个名为onconnect的函数。浏览器将在启动时调用onconnect,并传递一个事件。worker应该访问此事件的ports属性来提取一个稳定的通信端口回浏览器,并在worker的生命周期内持久化它
sharedworker和serviceworker的区别:
与SharedWorker不同:
现在service worker的最佳使用场景是提供离线能力。开发人员可以注册一个service worker作为网络代理提供网络拦截。即使没有可用的网络时,这个代理也能够对缓存的数据和资源或者是已经生成的内容作出响应
和现有的HTML5数据缓存功能有很大的不同,service worker的离线能力是可编程的。Russell称它是一个:“让你做出选择去做哪些事的、可编程的、浏览器内置的代理”。由于service worker运行于后台,它和当前的Web页面完全独立。