worker - javaScript多线程编程

    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){

}

 

子线程 与 子线程通讯

 

只能经过前台作为一个中介进行通讯

 

注意: 不在站中测试将致使找不到资源文件

相关文章
相关标签/搜索