singletonWorker
2020-09-08 23:09:59
なんか挙動が変だなと思ったら、処理待ちと処理終了の処理を逆にしてた
処理中のときに処理を投げ、処理終了のときに処理待ちしていた
あほやん
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 バグ修正完了
用途
一番最後に投げれられた仕事だけやってくれればいいとき
つまり、命令を上書きする
仕様
処理待ちとして、投げる予定の変数を記録しておく
処理が終了したら、最新の処理待ちだけを一回実行する
script.jsexport 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};
}
}