var worker = new Worker('./work.js');
构造函数Worker引用的脚步文件work.js就是Worker线程的执行任务。如果构造函数Worker引用的参数路径不对,Worker会默认失败,Worker线程将不执行。
worker.postMessage('Hello World'); worker.postMessage({method: 'echo', args: ['Work']});
主线程通过实例对象worker的postMessage向Worker发消息。postMessage的参数可以是任意类型。
worker.onmessage = function (event) { console.log('Received message ' + event.data); doSomething(); } function doSomething() { // 执行任务 worker.postMessage('Work done!'); }
主线程通过调用实例onmessage方法监听Worker线程发来的消息(event.data)
worker.terminate();
self.addEventListener('message', function (e) { self.postMessage('You said: ' + e.data); }, false);
self代表Woker线程的全局对象,等同下面两种写法:
// 写法一 this.addEventListener('message', function (e) { this.postMessage('You said: ' + e.data); }, false); // 写法二 addEventListener('message', function (e) { postMessage('You said: ' + e.data); }, false);
self.addEventListener('message', function (e) { var data = e.data; switch (data.cmd) { case 'start': self.postMessage('WORKER STARTED: ' + data.msg); break; case 'stop': self.postMessage('WORKER STOPPED: ' + data.msg); self.close(); // Terminates the worker. break; default: self.postMessage('Unknown command: ' + data.msg); }; }, false);
和主线程方法一样,通过调用Worker线程的postMessage向主线程发送消息,参数就是发送的数据
self.close();
<!DOCTYPE html> <body> //worker线程的脚本 <script id="worker" type="app/worker"> addEventListener('message', function () { postMessage('some message'); }, false); </script> //主线程脚本 <script> var blob = new Blob([document.querySelector('#worker').textContent]); var url = window.URL.createObjectURL(blob); var worker = new Worker(url); worker.onmessage = function (e) { // e.data === 'some message' }; </script> </body> </html>
上面代码中,先将嵌入网页的脚本代码,转成一个二进制对象,然后为这个二进制对象生成 URL,再让 Worker 加载这个 URL。这样就做到了,主线程和 Worker 的代码都在同一个网页上面。
var myWorker = new Worker(jsUrl, options);
主线程全局对象提供了Worker构造函数,它接收两个参数,第一个参数是脚本文件的的同源网址,该参数必须的,否则会报错;第二个参数是可选的配置对象,它的主要作用是指定Worke线程的名称,用来区分多个Worker线程。
// 主线程
var myWorker = new Worker('worker.js', { name : 'myWorker' });
// Worker 线程
self.name // myWorker
Worker()创建的实例对象,提供了以下属性和方法:
Worker.onerror:指定 error 事件的监听函数。
Worker.onmessage:指定 message 事件的监听函数,发送过来的数据在Event.data属性中。
Worker.onmessageerror:指定 messageerror 事件的监听函数。发送的数据无法序列化成字符串时,会触发这个事件。
Worker.postMessage():向 Worker 线程发送消息。
Worker.terminate():立即终止 Worker 线程。
Web Worker 有自己的全局对象,不是主线程的window,而是一个专门为 Worker 定制的全局对象。因此定义在window上面的对象和方法不是全部都可以使用。
Worker 线程有一些自己的全局属性和方法。
self.name: Worker 的名字。该属性只读,由构造函数指定。
self.onmessage:指定message事件的监听函数。
self.onmessageerror:指定 messageerror 事件的监听函数。发送的数据无法序列化成字符串时,会触发这个事件。
self.close():关闭 Worker 线程。
self.postMessage():向产生这个 Worker 线程发送消息。
self.importScripts():加载 JS 脚本。