generated at
singletonWorker
WebWorkerにたくさん処理を投げたいときに使うやつ

2020-09-08 23:09:59
なんか挙動が変だなと思ったら、処理待ちと処理終了の処理を逆にしてた
処理中のときに処理を投げ、処理終了のときに処理待ちしていた
あほやんtakker
23:11:36 修正した
23:16:54 補完自体が効かなくなってしまった。
なんでだ?
23:19:58
if(!this._isRunning) じゃなくて if(this._isRunning)
実行中は処理を飛ばすようにする
23:23:48
処理が開始した後、flagを立てていなかった
直した
23:29:58 flagが処理終了後に戻らない?
this.postMessage ではなく this._worker.postMessage を呼ばないとダメだ
flag操作されてしまう
直した
23:37:50 バグ修正完了

用途
WebWorkerが処理中かどうか気にせずに処理を投げたいとき
一番最後に投げれられた仕事だけやってくれればいいとき
つまり、命令を上書きする

仕様
なにかの処理を実行している間は、WebWorkerpostMessageを投げない
処理待ちとして、投げる予定の変数を記録しておく
処理が終了したら、最新の処理待ちだけを一回実行する

script.js
export class singletonWorker { constructor(sourceCode) { this._worker = new Worker(sourceCode); this._isRunning = false; this._resetBuffer(); } postMessage(message,transfer = []) { if(this._isRunning) { //console.log(`The Web Worker is running, so this action is pending.`); this._buffer.message = message; this._buffer.transfer = transfer; return; } //console.log('Start running...'); this._worker.postMessage(message, transfer); this._isRunning = true; } addEventListener(type, eventHandler) { this._worker.addEventListener(type, e => { eventHandler(e); //console.log('done.'); if(this._buffer.message) { //console.log('The pending work is found. start running again...'); this._worker.postMessage(this._buffer.message, this._buffer.transfer); this._resetBuffer(); return; } this._isRunning = false; //console.log('Ready to work.'); }); } _resetBuffer() { this._buffer = {message: undefined, transfer: undefined}; } }