9.2 Dedicated Worker

中譯:「專有 Worker」 或 「一般 Worker」。

範例

建立相關檔案及原始碼:

  • html5/worker/worker.html 檔案。

  • html5/worker/js_worker/worker.js 檔案。

原始碼:

<!DOCTYPE html>
<html lang="zh-Hant">
  <head>
    <meta charset="utf-8">
    <title>Dedicated Worker(專有 Worker 或 稱做一般 Worker)</title>
  </head>
  <body>
    <p>計數器:<span id="result"></span></p>
    <button type="button" id="start_worker">啟動 Worker</button>
    <button type="butotn" id="stop_worker">停止 Worker</button>

    <script>

      var worker;
      var btn_start_worker = document.getElementById("start_worker");
      var btn_stop_worker = document.getElementById("stop_worker");

      btn_start_worker.addEventListener("click", function(){
        console.log(worker);
        if(window.Worker){
          
          if(!worker){
            // 建立一個 Dedicated Worker
            worker = new Worker("./js_worker/worker.js");
            
            // worker 監聽 message 事件,看是否有回傳資料,有的話就觸發 message 事件
            worker.addEventListener("message", function(e){
              document.getElementById("result").innerHTML = e.data;
            });
            
          }else{
            alert("已啟用");
          }
          
        }else{
          alert("瀏覽器不支援 Worker");
        }
      });
      
      btn_stop_worker.addEventListener("click", function(){
        // 停止 worker 的執行
        worker.terminate();
        worker = undefined;
      });
    </script>
  </body>
</html>

功能

按下 「啟動 Worker」 按鈕後,Worker 每隔一秒就回傳資料給頁面(主執行緒)。若要停止 Worker 的執行的話,可按下 「停止 Worker」 按鈕,就可以清除 Worker 的執行。

結果示意

在主執行緒中,建立 Dedicated Worker

var worker;

// 建立一個 Dedicated Worker
worker = new Worker("./js_worker/worker.js");

在主執行緒中,監聽是否有資料從 Worker 中傳過來

資料可透過 e.data 取得:

// worker 監聽 message 事件,看是否有回傳資料,有的話就觸發 message 事件
worker.addEventListener("message", function(e){
  document.getElementById("result").innerHTML = e.data;
});

在主執行緒中,清除 Worker

// 停止 worker 的執行
worker.terminate();

// 將 worker 變數,設定成 undefined
worker = undefined;

在 Worker 中,執行倒數計數的兩種寫法

在 worker 中,可使用 self 關鍵字,來代表 worker 本身。(也可省略不寫)。

寫法 1:

var i = 0;
function timesCount() {
  i++;
  self.postMessage(i);

  setTimeout(function(){
    timesCount();
  }, 1000);
}
timesCount();

寫法 2:

var i = 0;
function timesCount() {
  i++;
  self.postMessage(i);
}
timesCount();
setInterval(function(){
  timesCount();
}, 1000);

Last updated