最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談HTML5 Web Worker的使用

  發(fā)布時(shí)間:2018-01-05 15:36:59   作者:心如檸檬天然酸   我要評(píng)論
這篇文章主要介紹了淺談HTML5 Web Worker的使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

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

一:如何使用Worker

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

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

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

HTML頁(yè)面:test.html

<!DOCTYPE HTML>
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
 <script type="text/javascript">
//WEB頁(yè)主線程
var worker =new Worker("worker.js"); //創(chuàng)建一個(gè)Worker對(duì)象并向它傳遞將在新線程中執(zhí)行的腳本的URL
 worker.postMessage("hello world");     //向worker發(fā)送數(shù)據(jù)
 worker.onmessage =function(evt){     //接收worker傳過(guò)來(lái)的數(shù)據(jù)函數(shù)
   console.log(evt.data);              //輸出worker發(fā)送來(lái)的數(shù)據(jù)
 }
 </script>
 </head>
 <body></body>
</html>

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

通過(guò)這個(gè)例子我們可以看出使用web worker主要分為以下幾部分

WEB主線程:

1.通過(guò) worker = new Worker( url ) 加載一個(gè)JS文件來(lái)創(chuàng)建一個(gè)worker,同時(shí)返回一個(gè)worker實(shí)例。

2.通過(guò)worker.postMessage( data ) 方法來(lái)向worker發(fā)送數(shù)據(jù)。

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

4.可以使用 worker.terminate() 來(lái)終止一個(gè)worker的執(zhí)行。

worker新線程:

1.通過(guò)postMessage( data ) 方法來(lái)向主線程發(fā)送數(shù)據(jù)。

2.綁定onmessage方法來(lái)接收主線程發(fā)送過(guò)來(lái)的數(shù)據(jù)。

二:Worker能做什么

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

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

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

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

由于javascript是單線程執(zhí)行的,在求數(shù)列的過(guò)程中瀏覽器不能執(zhí)行其它javascript腳本,UI渲染線程也會(huì)被掛起,從而導(dǎo)致瀏覽器進(jìn)入僵死狀態(tài)。使用web worker將數(shù)列的計(jì)算過(guò)程放入一個(gè)新線程里去執(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頁(yè)面: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, '時(shí)間:'+ timer2, '用時(shí):'+ ( timer2  - timer ) );
      }, false);
      var timer = (new Date()).valueOf();
      console.log('開(kāi)始計(jì)算:40','時(shí)間:'+ timer );
      setTimeout(function(){
          console.log('定時(shí)器函數(shù)在計(jì)算數(shù)列時(shí)執(zhí)行了', '時(shí)間:'+ (new Date()).valueOf() );
      },1000);
      worker.postMessage(40);
      console.log('我在計(jì)算數(shù)列的時(shí)候執(zhí)行了', '時(shí)間:'+ (new Date()).valueOf() );
  }  
  </script>
</head>
<body>
</body>
</html>

在Chrome中打開(kāi)fibonacci.html,控制臺(tái)得到如下輸出:

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

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

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

下面這個(gè)例子使用了web worker來(lái)計(jì)算場(chǎng)景中的像素,場(chǎng)景打開(kāi)時(shí)是一片一片進(jìn)行繪制的,一個(gè)worker只計(jì)算一塊像素值。

三:Worker的其他嘗試

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

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

// /aj/webWorker/core.js
function $E(id) {
    return document.getElementById(id);
}
onload =function() {
    //通過(guò)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));
        };
    };
    //通過(guò)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));
            }
        });
    };
    //通過(guò)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頁(yè)面:/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>

設(shè)置HOST

127.0.0.1 js.wcdn.cn

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

web worker: 174
jsonp: 25
ajax: 38

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

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

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

四:總結(jié)

web worker看起來(lái)很美好,但處處是魔鬼。

我們可以做什么:

1.可以加載一個(gè)JS進(jìn)行大量的復(fù)雜計(jì)算而不掛起主進(jìn)程,并通過(guò)postMessage,onmessage進(jìn)行通信

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

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

4.可以使用XMLHttpRequest來(lái)發(fā)送請(qǐng)求

5.可以訪問(wèn)navigator的部分屬性

有那些局限性:

1.不能跨域加載JS

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

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

4.不是每個(gè)瀏覽器都支持這個(gè)新特性

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • HTML5之多線程(Web Worker)

    這篇文章主要介紹了HTML5之多線程(Web Worker)的相關(guān)資料,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-02
  • 淺談Html5多線程開(kāi)發(fā)之WebWorkers

    這篇文章主要介紹了淺談Html5多線程開(kāi)發(fā)之WebWorkers的相關(guān)資料,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-02
  • HTML5之web workers_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    專(zhuān)用 Web Worker (Dedicated Web Worker) 提供了一個(gè)簡(jiǎn)單的方法使得 web 內(nèi)容能夠在后臺(tái)運(yùn)行腳本。下面通過(guò)本文給大家分享HTML5之web workers的相關(guān)知識(shí),需要的的朋友參考
    2017-07-17
  • 針對(duì)HTML5的Web Worker使用攻略

    這篇文章主要介紹了針對(duì)HTML5的Web Worker使用攻略,特別是結(jié)合worker拿手的JS使用起來(lái)十分有效,需要的朋友可以參考下
    2015-07-12
  • HTML5 Web Workers之網(wǎng)站也能多線程的實(shí)現(xiàn)

    Web Workers 是在HTML5中新增的,用來(lái)在web應(yīng)用程序中實(shí)現(xiàn)后臺(tái)處理的一種技術(shù)
    2013-04-24
  • 突襲HTML5之Javascript API擴(kuò)展1—Web Worker異步執(zhí)行及相關(guān)概述

    HTML5 中的 Web Worker 可以分為兩種不同線程類(lèi)型,一個(gè)是專(zhuān)用線程 Dedicated Worker,一個(gè)是共享線程 Shared Worker。兩種類(lèi)型的線程各有不同的用途,感興趣的朋友可以了解
    2013-01-31
  • HTML5 Web Worker(多線程處理)

    在HTML5中,可以使用Web Worker創(chuàng)建一個(gè)后臺(tái)線程執(zhí)行一個(gè)耗時(shí)任務(wù),本文主要介紹了HTML5 Web Worker(多線程處理),感興趣的可以了解一下
    2023-01-12

最新評(píng)論

万载县| 三门县| 九龙坡区| 万年县| 嘉义市| 界首市| 邻水| 晋宁县| 曲周县| 六盘水市| 乃东县| 五指山市| 新蔡县| 抚远县| 深泽县| 延庆县| 中西区| 天水市| 永州市| 泰州市| 乌鲁木齐市| 云和县| 香河县| 应城市| 赤水市| 宽甸| 克山县| 新乡市| 隆昌县| 乌拉特中旗| 台北县| 通化县| 瑞安市| 绥棱县| 马山县| 罗江县| 彭州市| 漾濞| 石嘴山市| 司法| 祁连县|