Web Worker

Web Worker 讓你在後臺運行JS代碼。

一般地,JavaScript和頁面UI會共用一個線程,當JavaScript在運行的時候,頁面是不響應用戶的任何操作的。這個時候,這段代碼就可以交給Web Worker來完成,不會影響頁面交互。


Web Worker 無法訪問DOM節點

Web Worker 無法訪問window、document之類的瀏覽器全局變量

Web Worker 無法訪問全局變量或全局函數

Web Worker 無法使用 alert(),confirm()等


1.常用API

(1)postMessage(data)

子線程與主線程之間互相通信使用方法,傳遞的data爲任意值

//worker = new Worker('url');
//worker.postMessage傳遞給子線程數據,對象
worker.postMessage({first:1,second:2});
//子線程中也可以使用postMessage,如傳遞字符串
postMessage(‘test’);

(2)terminate()

線程中終止worker,此後無法再利用其進行消息傳遞。注意:一旦terminate後,無法重新啓用,只能另外創建。

 function init(){                
      var worker = new Worker('worker.js');                
     //每隔100毫秒,向子線程傳遞{name: 'monkey'}信息                
      setInterval(function(){
           worker.postMessage({name: 'monkey'});
      },100);                
      //當主線程worker收到來自子線程的消息後,觸發message事件  
      worker.onmessage = function(event){                                
            document.getElementById('result').innerHTML+=event.data+"<br/>" ;                   //主線程使用terminate方法中斷與子線程來往,在瀏覽器中只能顯示一次event.data                    worker.terminate();
         };
    };


3.Web Worker 上下文

onmessage()   //接收消息事件

onerror()     //錯誤消息事件

<!DOCTYPE html>
    <head>
        <title>worker</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <script>
            function init(){
                var worker = new Worker('worker.js');
                //接收消息事件
                worker.onmessage = function(event){
                    console.log(event.data);
                };
                //錯誤信息事件
                worker.onerror = function(e){
                    console.log('erro: ' + e.message);
                    //終止線程
                    worker.terminate();
                };
            };
        </script>
    </head>
    <body onload = "init()">
        
    </body>
</html>


我們可以做什麼:

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

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

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

  4.可以使用XMLHttpRequest來發送請求

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

侷限性:

  1.不能跨域加載JS

  2.worker內代碼不能訪問DOM

  3.各個瀏覽器對Worker的實現不大一致,例如FF裏允許worker中創建新的worker,而Chrome中就不行

  4.IE這個新特性


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章