Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Javascript - how to avoid blocking the browser while doing heavy work?

Tags:

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?

like image 557
Gadi A Avatar asked Apr 16 '12 19:04

Gadi A


1 Answers

You could nest your calls inside a setTimeout call:

for(...) {     setTimeout(function(i) {         return function() { doSomethingHeavy(i); }     }(i), 0); } 

This queues up calls to doSomethingHeavy for 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 prefers postMessage for instantaneous, interrupt-able function invocation, but use setTimeout as a fallback for older browsers.

like image 119
apsillers Avatar answered Sep 24 '22 23:09

apsillers