Básicamente, lo que quiere hacer es dividir la operación en pedazos. Por ejemplo, supongamos que tiene 10 000 elementos que desea procesar, guárdelos en una lista y luego procese un pequeño número de ellos con un pequeño retraso entre cada llamada. He aquí una estructura simple que podría utilizar:
function performTask(items, numToProcess, processItem) {
var pos = 0;
// This is run once for every numToProcess items.
function iteration() {
// Calculate last position.
var j = Math.min(pos + numToProcess, items.length);
// Start at current position and loop to last position.
for (var i = pos; i < j; i++) {
processItem(items, i);
}
// Increment current position.
pos += numToProcess;
// Only continue if there are more items to process.
if (pos < items.length)
setTimeout(iteration, 10); // Wait 10 ms to let the UI update.
}
iteration();
}
performTask(
// A set of items.
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o'],
// Process two items every iteration.
2,
// Function that will do stuff to the items. Called once for every item. Gets
// the array with items and the index of the current item (to prevent copying
// values around which is unnecessary.)
function (items, index) {
// Do stuff with items[index]
// This could also be inline in iteration for better performance.
});
También tenga en cuenta que Google Gears has support to do work on a separate thread. Firefox 3.5 también introdujo its own workers that do the same thing (aunque siguen the W3 standard, mientras que Google Gears usa sus propios métodos).
+1, pero los trabajadores 'Gears no son exactamente lo que otro entorno llama 'hilos'. – Javier
Firefox 3.5 también tiene trabajadores estandarizados W3. Ver mi respuesta para enlaces. – Blixt