💡
HTML5
  • HTML5
  • 1. 簡介
    • 1.1 講者簡介
    • 1.2 課程簡介
    • 1.3 環境準備
  • 2. HTML5 元素
    • 2.1 語意結構標籤
    • 2.2 input 標籤的類型與屬性
    • 2.3 media 相關標籤
    • 2.4 圖形相關標籤
  • 3. History
    • 3.1 API 及相關說明
    • 3.2 練習
  • 4. Web Storage
    • 4.1 localStorage 與 sessionStorage 簡介
    • 4.2 資料儲存
    • 4.3 資料擷取
    • 4.4 資料更新
    • 4.5 資料刪除
    • 4.6 練習
  • 5. Fullscreen
    • 5.1 API 及相關說明
  • 6. File
    • 6.1 基本使用
    • 6.2 解析 CSV
  • 7. Drag and Drop
    • 7.1 簡介及主要事件說明
    • 7.2 練習 - 拖曳元素
    • 7.3 練習 - 其它事件
  • 8. Geolocation
    • 8.1 簡介
    • 8.2 相關 API 及範例
  • 9. Web Workers
    • 9.1 簡介
    • 9.2 Dedicated Worker
  • 10. 作業
  • 11. 參考資料
Powered by GitBook
On this page
  • 範例
  • 功能
  • 結果示意
  • 在主執行緒中,建立 Dedicated Worker
  • 在主執行緒中,監聽是否有資料從 Worker 中傳過來
  • 在主執行緒中,清除 Worker
  • 在 Worker 中,執行倒數計數的兩種寫法
  1. 9. Web Workers

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(){
        if(worker){
          worker.terminate(); // 停止 worker 的執行
          worker = undefined;
        }else{
          alert("worker 未啟用");
        }
      });
    </script>
  </body>
</html>
// 寫法 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);
*/

功能

按下 「啟動 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);

Previous9.1 簡介Next10. 作業

Last updated 10 months ago