一.个人理解
对于javaScript来说,使用单线程,严重影响效率,而**Web Workers 可以创造一个子线程与主线程并行运行**。将主线程中费时的任务放入子线程中处理,是的主线运行不被阻塞。
但Woreker使用完毕时,应注意及时关闭。
二.基本用法
1.使用Worker()构造函数里 实例化对象
var myworker = new Worker('js/worker.js', { name : 'myWorker' });//(脚本网址,可选-指定Worker名称,用来区分)
2.消息传递
a. x.postMessage(message, targetOrigin, [transfer])
data : 从其他 window 中传递过来的对象。
origin : 调用 postMessage 时消息发送方窗口的 origin
source :对发送消息的窗口对象的引用
b.x.addEventListener(event, function, useCapture)
event(必须):字符串,指定事件名。
unction(必须):指定要事件触发时执行的函数。
useCapture(可选):布尔值,指定事件是否在捕获或冒泡阶段执行。(true-事件在捕获阶段执行。false默认,在冒泡阶段执行)
使用时,主线程写法:
myworker.postMessage()//传递的目标子线程
myworker.addEventListener()
子线程写法:
self.postMessage()//表示自身线程
self.addEventListener()
3.基础代码
主线程
var myworker = new Worker('js/worker.js', { name : 'myWorker' });
myworker.postMessage('Hello World');
myworker.postMessage({method: 'echo', args: ['Work']});
myworker.postMessage('冰冻黑熊');
// 接收来自myworker线程的消息
myworker.onmessage = function (event) {
console.log(event.data);
}
Worker线程
self.addEventListener('message',function(e){
var data = e.data;
// console.log(data)
switch(typeof(data)){
case 'string':
self.postMessage("字符串:"+data);
break;
case 'object':
self.postMessage("数组:"+data);
break;
}
},false)
self.addEventListener('message',function(e){
var data = e.data;
// console.log(data)
switch(typeof(data)){
case 'string':
self.postMessage("字符串:"+data);
break;
case 'object':
self.postMessage("数组:"+data);
// 自我关闭
self.close()
break;
}
},false)
区别原因在于 self.close(),使用时,则会关闭本身线程。
4.线程中常见的api
主线程:
a.myworker.postMessage:主线程向目标子线程发送消息。
b.myworker.terminate:主线程关闭目标子线程
c.worker.onmessage: 指定worker线程发消息时的回调与worker.addEventListener(‘message’)类似,有关差别可自行去查
d.worker.onerror: 指定worker线程发生错误时的回调,也可以 worker.addEventListener(‘error’)同上
子线程:
a.self.postMessage:主线程向目标子线程发送消息。
b.self.terminate:主线程关闭目标子线程
c.self.onmessage: 指定worker线程发消息时的回调与worker.addEventListener(‘message’)类似,有关差别可自行去查
d.self.onerror: 指定worker线程发生错误时的回调,也可以 worker.addEventListener(‘error’)同上