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 =...