На одном из ресурсов встретил реализацию обработки больших массивов, предотвращающая подвисание браузеров.
/**
* @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);
На выходе:
...
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);
};
При необходимости можно засунуть в прототип:
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);
};