Web Worker是HTML5提供的一個javascript多執行緒解決方案,我們可以將一些大運算量的程式碼交由web Worker運行而不凍結使用者介面。本文主要介紹了淺談HTML5 Web Worker的使用,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧,希望能幫助大家。
一:如何使用Worker
Web Worker的基本原理就是在目前javascript的主執行緒中,使用Worker類別來載入一個javascript檔來開啟一個新的執行緒,起到互不阻塞執行的效果,並且提供主線程和新線程之間資料交換的介面:postMessage,onmessage。
那麼要如何使用呢,我們看一個例子:
//worker.js onmessage =function (evt){ var d = evt.data;//通过evt.data获得发送来的数据 postMessage( d );//将获取到的数据发送会主线程 }
HTML頁面:test.html
##
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <script type="text/javascript"> //WEB页主线程 var worker =new Worker("worker.js"); //创建一个Worker对象并向它传递将在新线程中执行的脚本的URL worker.postMessage("hello world"); //向worker发送数据 worker.onmessage =function(evt){ //接收worker传过来的数据函数 console.log(evt.data); //输出worker发送来的数据 } </script> </head> <body></body> </html>
二:Worker能做什麼
知道如何使用web worker ,那麼它到底有什麼用,可以幫我們解決那些問題呢。我們來看一個fibonacci數列的例子。 大家知道在數學上,fibonacci數列被以遞歸的方法定義:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2, n∈N*),而javascript的常用實作為:var fibonacci =function(n) { return n <2? n : arguments.callee(n -1) + arguments.callee(n -2); }; //fibonacci(36)
//fibonacci.js var fibonacci =function(n) { return n <2? n : arguments.callee(n -1) + arguments.callee(n -2); }; onmessage =function(event) { var n = parseInt(event.data, 10); postMessage(fibonacci(n)); };
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>web worker fibonacci</title> <script type="text/javascript"> onload =function(){ var worker =new Worker('fibonacci.js'); worker.addEventListener('message', function(event) { var timer2 = (new Date()).valueOf(); console.log( '结果:'+event.data, '时间:'+ timer2, '用时:'+ ( timer2 - timer ) ); }, false); var timer = (new Date()).valueOf(); console.log('开始计算:40','时间:'+ timer ); setTimeout(function(){ console.log('定时器函数在计算数列时执行了', '时间:'+ (new Date()).valueOf() ); },1000); worker.postMessage(40); console.log('我在计算数列的时候执行了', '时间:'+ (new Date()).valueOf() ); } </script> </head> <body> </body> </html>
我在計算數列的時候執行了時間:1316508212734
定時器函數在計算數列時執行了時間:1316508213735
結果:102334155 時間:1316508262820 用時:50115
三:Worker的其他嘗試
我們已經知道Worker透過接收一個URL來創建一個worker,那麼我們是否可以利用web worker來做一些類似jsonp的請求呢,大家知道jsonp是透過插入script標籤來載入json資料的,而script元素在載入和執行過程中都是阻塞式的,如果能利用web worker實現非同步載入將會非常好。 下面這個範例將透過web worker、jsonp、ajax三種不同的方式來載入一個169.42KB大小的JSON資料// /aj/webWorker/core.js function $E(id) { return document.getElementById(id); } onload =function() { //通过web worker加载 $E('workerLoad').onclick =function() { var url ='http://js.wcdn.cn/aj/mblog/face2'; var d = (new Date()).valueOf(); var worker =new Worker(url); worker.onmessage =function(obj) { console.log('web worker: '+ ((new Date()).valueOf() - d)); }; }; //通过jsonp加载 $E('jsonpLoad').onclick =function() { var url ='http://js.wcdn.cn/aj/mblog/face1'; var d = (new Date()).valueOf(); STK.core.io.scriptLoader({ method:'post', url : url, onComplete : function() { console.log('jsonp: '+ ((new Date()).valueOf() - d)); } }); }; //通过ajax加载 $E('ajaxLoad').onclick =function() { var url ='http://js.wcdn.cn/aj/mblog/face'; var d = (new Date()).valueOf(); STK.core.io.ajax({ url : url, onComplete : function(json) { console.log('ajax: '+ ((new Date()).valueOf() - d)); } }); }; };
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>Worker example: load data</title> <script src="http://js.t.sinajs.cn/STK/js/gaea.1.14.js" type="text/javascript"></script> <script type="text/javascript" src="http://js.wcdn.cn/aj/webWorker/core.js"></script> </head> <body> <input type="button" id="workerLoad" value="web worker加载"></input> <input type="button" id="jsonpLoad" value="jsonp加载"></input> <input type="button" id="ajaxLoad" value="ajax加载"></input> </body> </html>
web worker: 174 jsonp: 25 ajax: 38
所以web worker只能用來載入同域下的json數據,而這方面ajax已經可以做到了,而且效率更高更通用。還是讓Worker做它自己擅長的事吧。
四:總結
web worker看起來很美好,但到處都是魔鬼。
我們可以做什麼:
1.可以載入一個JS進行大量的複雜計算而不掛起主進程,並透過postMessage,onmessage進行通訊
2.可以在worker中透過importScripts(url)載入另外的腳本檔案
3.可以使用setTimeout(), clearTimeout(), setInterval(), and clearInterval()
4.可以使用XMLHttpRequest來傳送請求
#5.可以存取navigator的部分屬性
#有那些限制:
#1.不能跨網域載入JS
##2. worker內程式碼不能存取DOM3.各個瀏覽器對Worker的實作不大一致,例如FF裡允許worker中創建新的worker,而Chrome中就不行4.不是每個瀏覽器都支援這個新功能相關推薦:以上是HTML5 Web Worker的使用實例教學的詳細內容。更多資訊請關注PHP中文網其他相關文章!