欧美成人午夜免费全部完,亚洲午夜福利精品久久,а√最新版在线天堂,另类亚洲综合区图片小说区,亚洲欧美日韩精品色xxx

扣丁學堂HTML5培訓淺談HTML5 Web Worker的使用

2019-09-24 13:29:26 5718瀏覽

關(guān)于HTML5 Web Worker的使用有多少的小伙伴知道或者是了解呢?不了解的小伙伴也沒有關(guān)系,本篇文章扣丁學堂HTML5培訓小編就給大家分享一下HTML5 Web Worker的使用,感興趣的小伙伴就跟隨小編過來看看吧。


扣丁學堂HTML5培訓淺談HTML5 Web Worker的使用


Web Worker是HTML5提供的一個javascript多線程解決方案,我們可以將一些大計算量的代碼交由web Worker運行而不凍結(jié)用戶界面。


一:如何使用Worker


Web Worker的基本原理就是在當前javascript的主線程中,使用Worker類加載一個javascript文件來開辟一個新的線程,起到互不阻塞執(zhí)行的效果,并且提供主線程和新線程之間數(shù)據(jù)交換的接口:postMessage,onmessage。


那么如何使用呢,我們看一個例子:


//worker.js
onmessage =function (evt){
  var d = evt.data;//通過evt.data獲得發(fā)送來的數(shù)據(jù)
  postMessage( d );//將獲取到的數(shù)據(jù)發(fā)送會主線程
}


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"); //創(chuàng)建一個Worker對象并向它傳遞將在新線程中執(zhí)行的腳本的URL
 worker.postMessage("hello world");     //向worker發(fā)送數(shù)據(jù)
 worker.onmessage =function(evt){     //接收worker傳過來的數(shù)據(jù)函數(shù)
   console.log(evt.data);              //輸出worker發(fā)送來的數(shù)據(jù)
 }
 </script>
 </head>
 <body></body>
</html>


用Chrome瀏覽器打開test.html后,控制臺輸出  "hello world" 表示程序執(zhí)行成功。


通過這個例子我們可以看出使用web worker主要分為以下幾部分


WEB主線程:

1、通過 worker = new Worker( url ) 加載一個JS文件來創(chuàng)建一個worker,同時返回一個worker實例。

2、通過worker.postMessage( data ) 方法來向worker發(fā)送數(shù)據(jù)。

3、綁定worker.onmessage方法來接收worker發(fā)送過來的數(shù)據(jù)。

4、可以使用 worker.terminate() 來終止一個worker的執(zhí)行。


worker新線程:

1、通過postMessage( data ) 方法來向主線程發(fā)送數(shù)據(jù)。

2、綁定onmessage方法來接收主線程發(fā)送過來的數(shù)據(jù)。



二:Worker能做什么


知道了如何使用web worker ,那么它到底有什么用,可以幫我們解決那些問題呢。我們來看一個fibonacci數(shù)列的例子。


大家知道在數(shù)學上,fibonacci數(shù)列被以遞歸的方法定義:F0=0,F(xiàn)1=1,F(xiàn)n=F(n-1)+F(n-2)(n>=2,n∈N*),而javascript的常用實現(xiàn)為:


var fibonacci =function(n) {
    return n <2? n : arguments.callee(n -1) + arguments.callee(n -2);
};
//fibonacci(36)


在chrome中用該方法進行39的fibonacci數(shù)列執(zhí)行時間為19097毫秒 ,而要計算40的時候瀏覽器直接提示腳本忙了。


由于javascript是單線程執(zhí)行的,在求數(shù)列的過程中瀏覽器不能執(zhí)行其它javascript腳本,UI渲染線程也會被掛起,從而導致瀏覽器進入僵死狀態(tài)。使用web worker將數(shù)列的計算過程放入一個新線程里去執(zhí)行將避免這種情況的出現(xiàn)。具體看例子:


//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));
};


HTML頁面:fibonacci.html


<!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( '結(jié)果:'+event.data, '時間:'+ timer2, '用時:'+ ( timer2  - timer ) );
      }, false);
      var timer = (new Date()).valueOf();
      console.log('開始計算:40','時間:'+ timer );
      setTimeout(function(){
          console.log('定時器函數(shù)在計算數(shù)列時執(zhí)行了', '時間:'+ (new Date()).valueOf() );
      },1000);
      worker.postMessage(40);
      console.log('我在計算數(shù)列的時候執(zhí)行了', '時間:'+ (new Date()).valueOf() );
  }  
  </script>
</head>
<body>
</body>
</html>


在Chrome中打開fibonacci.html,控制臺得到如下輸出:


開始計算:40 時間:1316508212705
我在計算數(shù)列的時候執(zhí)行了 時間:1316508212734
定時器函數(shù)在計算數(shù)列時執(zhí)行了 時間:1316508213735
結(jié)果:102334155 時間:1316508262820 用時:50115


這個例子說明在worker中執(zhí)行的fibonacci數(shù)列的計算并不會影響到主線程的代碼執(zhí)行,完全在自己獨立的線程中計算,只是在計算完成之后將結(jié)果發(fā)回主線程。


利用web worker我們可以在前端執(zhí)行一些復雜的大量運算而不會影響頁面的展示,并且不會彈出惡心的腳本正忙提示。


下面這個例子使用了web worker來計算場景中的像素,場景打開時是一片一片進行繪制的,一個worker只計算一塊像素值。



三:Worker的其他嘗試


我們已經(jīng)知道Worker通過接收一個URL來創(chuàng)建一個worker,那么我們是否可以利用web worker來做一些類似jsonp的請求呢,大家知道jsonp是通過插入script標簽來加載json數(shù)據(jù)的,而script元素在加載和執(zhí)行過程中都是阻塞式的,如果能利用web worker實現(xiàn)異步加載將會非常不錯。


下面這個例子將通過 web worker、jsonp、ajax三種不同的方式來加載一個169.42KB大小的JSON數(shù)據(jù)


// /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));
            }
        });
    };
};


HTML頁面:/aj/webWorker/worker.html


<!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>


設置HOST

127.0.0.1 js.wcdn.cn

通過 http://js.wcdn.cn/aj/webWorker/worker.html 訪問頁面然后分別通過三種方式加載數(shù)據(jù),得到控制臺輸出:


web worker: 174
jsonp: 25
ajax: 38


多試幾次發(fā)現(xiàn)通過jsonp和ajax加載數(shù)據(jù)的時間相差不大,而web worker的加載時間一直處于高位,所以用web worker來加載數(shù)據(jù)還是比較慢的,即便是大數(shù)據(jù)量情況下也沒任何優(yōu)勢,可能是Worker初始化新起線程比較耗時間。除了在加載過程中是無阻塞的之外沒有任何優(yōu)勢。


那么web worker是否能支持跨域js加載呢,這次我們通過http://127.0.0.1/aj/webWorker/worker.html 來訪問頁面,當點擊 "web worker加載" 加載按鈕時Chrome下無任何反映,F(xiàn)F6下提示錯誤。由此我們可以知道web worker是不支持跨域加載JS的,這對于將靜態(tài)文件部署到單獨的靜態(tài)服務器的網(wǎng)站來說是個壞消息。


所以web worker只能用來加載同域下的json數(shù)據(jù),而這方面ajax已經(jīng)可以做到了,而且效率更高更通用。還是讓Worker做它自己擅長的事吧。



四:總結(jié)


web worker看起來很美好,但處處是魔鬼。


我們可以做什么:

1、可以加載一個JS進行大量的復雜計算而不掛起主進程,并通過postMessage,onmessage進行通信

2、可以在worker中通過importScripts(url)加載另外的腳本文件

3、可以使用 setTimeout(), clearTimeout(), setInterval(), and clearInterval()

4、可以使用XMLHttpRequest來發(fā)送請求

5、可以訪問navigator的部分屬性


有那些局限性:

1、不能跨域加載JS

2、worker內(nèi)代碼不能訪問DOM

3、各個瀏覽器對Worker的實現(xiàn)不大一致,例如FF里允許worker中創(chuàng)建新的worker,而Chrome中就不行

4、不是每個瀏覽器都支持這個新特性


想了解更多關(guān)于HTML5方面內(nèi)容的小伙伴,請關(guān)注扣丁學堂HTML5培訓官網(wǎng)、微信等平臺,扣丁學堂IT職業(yè)在線學習教育平臺為您提供權(quán)威的HTML5視頻,扣丁學堂老師精心推出的HTML5視頻教程定能讓你快速掌握HTML5從入門到精通開發(fā)實戰(zhàn)技能。扣丁學堂H5技術(shù)交流群:673883249。


                           【掃碼進入HTML5VIP免費公開課】  


     【關(guān)注微信公眾號獲取更多學習資料】        【掃碼進入HTML5前端開發(fā)VIP免費公開課】  



查看更多關(guān)于“HTML5開發(fā)技術(shù)資訊”的相關(guān)文章>>


標簽: HTML5培訓 HTML5視頻教程 HTML5學習視頻 HTML5在線視頻 HTML5 Web Worker的使用

熱門專區(qū)

暫無熱門資訊

課程推薦

微信
微博
15311698296

全國免費咨詢熱線

郵箱:codingke@1000phone.com

官方群:148715490

北京千鋒互聯(lián)科技有限公司版權(quán)所有   北京市海淀區(qū)寶盛北里西區(qū)28號中關(guān)村智誠科創(chuàng)大廈4層
京ICP備2021002079號-2   Copyright ? 2017 - 2022
返回頂部 返回頂部