Tengo una función de fondo que analiza una gran cantidad de datos de una serie de archivos. El tiempo para consumir un solo archivo puede ser largo, por lo que mi función a veces puede bloquear el motor JS durante 2 o 3 segundos.
for (let x = 0; x <= dataView.byteLength - 1; x++) strView += String.fromCharCode(dataView.getUint8(x))
Realmente no necesito que esto se ejecute más rápido, es un proceso en segundo plano de baja prioridad. Lo que necesito es que esta función (que es una función asíncrona llamada a través de void y no esperar) no bloquee otras funciones durante 2-3 segundos a la vez durante el procesamiento de un solo archivo.
¿Hay alguna forma de modificar este bucle for para otorgar permiso al bucle de eventos JS para realizar otras tareas en medio del bucle "for" anterior? Intenté esperar una breve promesa de vez en cuando en el bucle, pero eso no parece dar resultado. ¿Lo que estoy tratando de hacer (para evitar que un proceso en segundo plano bloquee las prioridades más altas) realmente solo se puede lograr a través de algo como un Web Worker para una verdadera multiproceso/tarea?
v2.0
function sleep(fff) { return new Promise(rs => setTimeout(rs, fff)); } async function slow(count, callback, threshold = 10000) { var i = 0; while (i < count) { callback(i++); if (i % threshold === 0) { await sleep(1); } } } var strView = ''; slow(dataView.byteLength, x => strView += String.fromCharCode(dataView.getUint8(x))).then(() => { console.log(strView); });