【JS】Web Workers ~ JavaScript の マルチスレッド化 ~

■ 用語

Shared Worker

 * タブやiframeなど別のスクリプトからアクセスできるスレッド形式


■ サンプル

DemoForWorker.html

<!DOCTYPE html>
<html lang="jp">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>Demo</title>
</head>
<body>
<div id="result">Result</div>
<script>
// Workerの作成
var worker = new Worker("MyWorker.js");
// ローカル実行時
// var newWorkerViaBlob = function(relativePath) {
//   var baseURL = window.location.href.replace(/\\/g, '/').replace(/\/[^\/]*$/, '/');
//   var array = ['importScripts("' + baseURL + relativePath + '");'];
//   var blob = new Blob(array, {type: 'text/javascript'});
//   var url = window.URL.createObjectURL(blob);
//   return new Worker(url);
// };
// var worker = newWorkerViaBlob("MyWorker.js");


// 処理結果、受信イベント
worker.addEventListener('message', function(event) {
  var result = document.getElementById("result");
  result.innerHTML = event.data;
}, false);

// メッセージを送信する
worker.postMessage('Hello World');

// エラーを表示する
worker.addEventListener('error', (error) => {
   console.log("[ERROR] " + error);
});

</script>
</body>
</html>

MyWorker.js

self.addEventListener('message', function(event) {

  // Do something
  var startMsec = new Date();
  while (new Date() - startMsec < 5000);
  
  // 処理結果を送信
  self.postMessage(event.data);
}, false);