<body> <div> <button id="runWorker">Start</button> </div> <script> function defTickWorker() { let interval = 1000; let intervalID = null; self.addEventListener('message', (event) => { if(event.data.interval) { interval = event.data.interval; } if(event.data.id == 'Start') { intervalID = setInterval(() => { postMessage({'id': 'tick'}); }, interval); } else if(event.data.id == 'Stop') { clearInterval(intervalID); intervalID = null; } }); } const source = defTickWorker.toString().match(/{.*}/s); const blob = new Blob([source], {type: 'text/javascript'}); const tickWorker = new Worker(URL.createObjectURL(blob)); tickWorker.addEventListener('message', (event) => { console.log("message: " + event.data.id); }); tickWorker.postMessage({'interval': 100}); const runButton = document.getElementById('runWorker'); runButton.addEventListener('click', (event) => { tickWorker.postMessage({'id': event.target.innerText}); event.target.innerText = event.target.innerText == 'Start' ? 'Stop' : 'Start'; }); </script> </body>
外部ファイルを使わない埋込式のWorker (Web Workers API)
1.ワーカーの処理を1つの関数内で記述する。
2.関数の中身を文字列にする。
3.文字列→Blob(text/javascript)→URLに変換。
4.Workerを生成。
ラベル:
JavaScript,
Webブラウザ