Javascript. Large data processing

На одном из ресурсов встретил реализацию обработки больших массивов, предотвращающая подвисание браузеров.

/**
 * @param data: An array of items to process
 * @param handler: a function which processes an individual data item
 * @param callback: an optional function called when all processing is complete
 */
var processArray = function (data, handler, callback) {
var maxtime = 100; // chunk processing time
var delay = 20; // delay between processes
var queue = data.concat(); // clone original array

 var processor = function () {
  var endtime = +new Date() + maxtime;

  do {
     handler(queue.shift());
  } while (queue.length > 0 && endtime > +new Date());

   if (queue.length > 0)
     setTimeout(processor, delay);
   else
     if (callback) callback();
 };
 setTimeout(processor, delay);
};

// testing...

var data = [];

for (var i = 1, str = 'ch'; i <= 10000; i++)
data.push(str + i);

var handler = function (item) {
console.log(item);
};

var callback = function () {
console.log('end processing');
};
processArray(data, handler, callback);


На выходе:


ch1
ch2
ch3
...
ch9997
ch9998
ch9999
ch10000
end processing


При необходимости можно засунуть в прототип:


Array.prototype.process = function (handler, callback) {
if (typeof handler !== 'function')
throw new Error("Not given handler function");

if (typeof callback !== 'function')
callback = function () {};

var maxtime = 100, // время обработки блока
delay = 20; // временная задержка между обработками

var queue = this.concat(); // копия текущего массива

var processor = function () {
var endtime = +new Date() + maxtime;

do {
handler(queue.shift());
} while (queue.length > 0 && endtime > +new Date());

if (queue.length > 0)
setTimeout(processor, delay);
else
if (callback) callback();
};

setTimeout(processor, delay); 
};