1,提出问题
执行一个同步操作时,如果耗时非常长,导致主线程堵塞的问题
问题的产生:由于用户界面和js进程公用一个线程,js高强度的计算会导致浏览器无暇
顾忌用户界面,进入假死状态
2,多线程
通过使用 web worker,我们可以在浏览器的后台运行js,进而不占用浏览器自身线程
web worker可以提高应用的总体性能,并且提高用户体验
创建后台进程,这些进程不会卡死用户界面,更适合用来进行存数据与ui无关,比较小号cpu的计算
3,web worker 兼容支持性
if(window.Worker){
alert('支持')
}else{
alert('不支持')
}
ie6789不支持
4,web worker 工作原理
--向worker发送要处理的数据--
页面 worker进程
<--worker将接收到的数据进行<--处理,并返回给页面
5,web worker语法
创建worker对象:
var work = new Worker(url);
参数url:处理该worker进程的js文件路径
eg:
var ww = new Worker('js/count.js');
页面向worker发送数据:
ww.postMessage(msg);
参数msg:向worker空间发的数据,最好为字符串,其他数据格式要注意兼容性
eg:
ww.postMessage('hello word');
页面接收worker返回的数据:
message事件 worker返回数据时触发
eg:
ww.adEventListener('message',function(e){
alert(e.data);//e.data就是worker返回的内容
},false);
worker接收数据:
message事件 页面发送数据是触发
eg:
self.addEventListener('message',function(e){
e.data
//就是页面发送来的数据
//数据处理
//数据返回
},false)
worker数据返回:
postMessage(msg);
参数msg:返回给页面处理过数据
6,停止worker
1)在页面中停止worker
ww.terminate()
2)在worker中停止worker
close();
7,在worker内部可以在次开启worker
importScript(url,url,...);
eg:
importScript('worker1.js','worker2.js');
addEventListener('message',function(e){});
8,web Worker 注意事项
1)worker进程内,全局对象不是window,而是self
2)不能使用DOM,但是可以访问定时器和ajax
3)不同浏览器对跨域限制不同,最好不要跨域
4)子线程webkit不兼容,不建议使用