Web Workers 是 HTML5 提供的一个javascript多线程解决方案,咱们能够将一些大计算量的代码交由web Worker运行而不冻结用户界面。它独立于其余脚本,不会影响页面的性能。您能够继续作任何愿意作的事情:点击、选取内容等等,而此时 web worker 在后台运行。javascript
一、Web Worker的建立是在主线程当中经过传入文件的url来实现的。以下所示:
var webworker=new Worker('my_task.js'); 返回的webworker对象,该对象能够完成与worker线程的通讯java
webworker.postMessage() 向线程发送消息web
webworker.onmessage=function(evt){} 来监听worker线程发送到主线程的消息ajax
webworker.onerror=function(evt){} 来监听线程中的错误消息跨域
webworker.terminate() 来告诉worker线程当即终止执行。 浏览器
二、web worker线程是没法操做Dom对象的,因此像prompt、alert、console等都是没法在web worker线程中使用的,因此调试不太处理。可是能够将调试发送给主线程,主线程经过web worker线程发出的请求做出处理,Jquery是不行了。session
三、用于建立webworker线程的js文件必须和当前页面遵循同源策略,也就是说不能跨域请求js文件;另外,线程之间的消息传递是不能有Function对象的,就是说不可以传递函数,在safari浏览器中只能传递数字/字符串等基本值(连Object都不行)。而且全部线程之间的数据并非常规的引用方式,都是一份独立的拷贝。所以通常状况下,咱们会将传递的参数转化为字符串进行传递,能够经过JSON.stringify()和JSON.parse()来处理。多线程
Worker API异步
1.onmessage : 接收数据函数
2.postMessage(data) : 发送数据
3.importScripts("xx.js","xx.js"...) :用于导入javaScript脚本
4.sessionStorge/localStorage: 彻底能够在Worker线程中使用Storage来执行本地存储
5.Worker :建立新的worker对象来启动嵌套线程
6.*XMLHttpRequest :Worker线程中可使用XMLHttpRequest来发送异步请求。就是ajax
7.navigator: 这是一个WorkerNavigator对象,该对象的功能与window里的navigator属性类似。
8.localtion: 这是一个WorkerLoaction对象,该对象的功能与window里的localtion属性类似。
9.self: 表明了当前worker线程自身的做用域。调用self.close(); 能够结束本线程。
10. setTimeout()/setInterval()/eval()/isNaN()/parsInt()等。。。
主线程 与 子线程通讯
主线程:
var worker = new Worker('worker.js'); var data = {id:"messgae"}; //向子线程发送数据 worker.postMessage(JSON.stringify(data)); //worker.terminate(); 关闭线程 //接收子线程的数据 worker.onmessage = function(event){ console.info(event.data); } |
子线程:
//导入js importScripts("temp.js"); //self.close(); 能够关闭线程 //从主线程接收数据 onmessage = function(event){ var data = JSON.parse(event.data); var id = data.id; //这js文件的路径 var path = location.href; //发送数据到主线程 postMessage(id); } onerror = function(event){ } |
子线程 与 子线程通讯
只能经过前台作为一个中介进行通讯
注意: 不在站中测试将致使找不到资源文件