I have such a function in my JS script:
function heavyWork(){
for (i=0; i<300; i++){
doSomethingHeavy(i);
}
}
Maybe “doSomethingHeavy” is ok by itself, but repeating it 300 times causes the browser window to be stuck for a non-negligible time. In Chrome it’s not that big of a problem because only one Tab is effected; but for Firefox its a complete disaster.
Is there any way to tell the browser/JS to “take it easy” and not block everything between calls to doSomethingHeavy?
You could nest your calls inside a
setTimeoutcall:This queues up calls to
doSomethingHeavyfor immediate execution, but other JavaScript operations can be wedged in between them.A better solution is to actually have the browser spawn a new non-blocking process via Web Workers, but that’s HTML5-specific.
EDIT:
Using
setTimeout(fn, 0)actually takes much longer than zero milliseconds — Firefox, for example, enforces a minimum 4-millisecond wait time. A better approach might be to use setZeroTimeout, which preferspostMessagefor instantaneous, interrupt-able function invocation, but usesetTimeoutas a fallback for older browsers.