Limitar la concurrencia en JavaScript
Un pool de trabajadores que toma tareas de una cola compartida.
async function mapLimit(items, limit, worker) {
const results = new Array(items.length);
let next = 0;
async function run() {
while (next < items.length) {
const index = next;
next += 1;
results[index] = await worker(items[index], index);
}
}
await Promise.all(Array.from({ length: limit }, run));
return results;
}
async function main() {
const doubled = await mapLimit([1, 2, 3, 4, 5], 2, async (n) => {
await new Promise((resolve) => setTimeout(resolve, 5));
return n * 2;
});
console.log(doubled);
}
main();
Cómo funciona
- Cada trabajador itera hasta vaciar la cola.
- El límite es cuántos trabajadores arrancas.
- Los resultados vuelven por índice, así se preserva el orden.
Palabras clave y builtins usados aquí
ArrayPromiseasyncawaitconstfromfunctionletreturnwhile
El intento, en números
- Líneas
- 25
- Caracteres a escribir
- 515
- Tokens
- 160
- Ritmo de tres estrellas
- 110 tpm
Al ritmo de tres estrellas de 110 tokens por minuto, este intento toma unos 87 segundos.
Paso 2 de 4 en Cancelar y limitar; paso 16 de 19 en Promesas y async.