Pausing web worker using async await
by Darker
HTML
<h1>
Basic web worker fiddle
</h1>
JavaScript
function workerFN() {
function Timeout(time) {
return new Promise(resolve=>setTimeout(resolve, time));
}
let mode = "inner";
let pausePromise = null;
async function loop() {
let iteration = 0;
let max = 1e6;
let percentRnd = 0;
for(let i=0;i<1000;i++) {
//Do stuff
for(let j=0;j<1000;j++) {
++iteration;
let percent = 100*(iteration/max);
if(Math.round(percent) > percentRnd) {
percentRnd = Math.round(percent);
console.info(percentRnd+"%");
}
if( mode == 'inner' ){
await Timeout(0);
}
if(pausePromise) {
console.log("Loop paused");
await pausePromise;
console.log("Loop resumed");
}
}
if( mode == 'outer' ){
await Timeout(0);
}
}
}
let workerLoop = null;
self.onmessage = function(event) {
var m = event.data;
if(m.operation == 'run') {
mode = m.mode;
if(!workerLoop) {
workerLoop = loop();
}
}
if(m.operation == 'pause') {
if(workerLoop) {
var listener = null;
pausePromise = new Promise(resolve=>self.addEventListener("message", listener = (event)=>{
if(event.data.operation=="run") {
console.log("Resuming loop from promise.");
self.removeEventListener("message", listener);
pausePromise = null;
resolve();
}
}))
}
else {
console.warn("Not running!");
}
}
}
}
// This is a trick to generate real worker script that is loaded from server
var url =...