重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章给大家分享的是有关HTML5新特性之多线程Worker SharedWorker的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
10年积累的成都做网站、成都网站建设经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有博罗免费网站建设让你可以放心的选择与我们合作。
1、方法介绍
(1)构造函数 new Worker(arg) :参数表示你的线程要执行的代码所在的js文件,例如‘myworker.js’,构造函数当然是返回一个Worker类的实例
(2)worker.postMessage(message):这个方法表示从主线程向子线程发送消息或者子线程向主线程发送消息,message一般是一个字符串,也可以将一个js对象转成字符串发过去
(3)worker上还有一个message事件,当有人向这个worker实例发送消息时,该事件被触发,我们可以从他的事件对象的data属性中获得post过来的值
可以看到Woker类的API是相当简洁的,只有两个最常用的方法,一个事件,下面我们来通过实际的例子看看。
//main.htmlmain
//thread1.js onmessage = function(event){ var res = event.data+"帅气!"; postMessage(res); }
当我在文本框输入“大~熊”点击发送按钮就会出现如下效果
简单分析分析,我在主线程由thead1.js创建了一个Worker的实例worker,当点击按钮时会调用他的postMessage方法,将文本框中的内容发送到thread1.js,我们的thread1.js怎么做的呢?是这样,他侦听message事件,主线程发送消息过来就触发这个事件,执行回调函数,回调函数从事件对象取得发送来的值,然后将这个值加上“帅气!”,然后在发送回去。主线程呢也侦听了worker的message事件,所以有消息过去时会触发,将消息内容显示在p中,如此就看到了上面的效果。
或许你会将这有什么用呢?这里确实没什么用,这里我们大可以在主线程还总完成加“帅气!”的操作,因为他的复杂度为O(1)(哈哈,最近在学算法!),但是假如不是做这么简单的操作呢?这种方法的好处就是不过你的子线程做多么复杂的工作,都不会让主线程停下来,主线程改干嘛还干嘛,等到子线程把数据处理好了他直接拿过来就好了。
陆老师将可以在子线程中在调用new Worker()创建新的子线程,我发现这样是不可以的,会报undefined错误,也就是说子线程中是不能调用Worker构造函数的,一开始以为是自己错了,后来查阅了官方文档,发现也没有相关的描述。
下面看一个在主线程调用多个子线程的例子:
//main.htmlmain
//thread1.js onmessage = function(event){ var res = event.data+"帅气!"; postMessage(res); }
//thread2.js onmessage = function(event){ var res = event.data+"没骗你哟!"; postMessage(res); close(); }
主线程要完成一个任务需要两个线程,它创建了两个线程worker1,2,先向worker1请求,得到返回的数据后,再请求worker2,同时将worker1处理之后的数据交给worder2处理,然后拿到最终结果,显示在页面上。
在子线程中可以引入其他的js文件然后调用,比如下边这个例子。
//main.htmlmain
//thread1.js importScripts('tools.js') onmessage = function(event){ var res = handler(event.data); postMessage(res); }
//tools.js function handler(data){ return data+"加油加油!" }
可以看到我们的thread1.js并没有一个叫做tools.js的文件,但是它通过importScripts()导入了一个js文件,然后就可以调用里边暴露出来的方法了。
SharedWorker的实质在于share,不同的线程可以共享一个线程,他们的数据也是共享的。
直接用例子来探讨。
使用方法一:
//main.htmlShared workers: demo 1