Estoy escribiendo una función que debería ejecutar todas las funciones asíncronas lo más rápido posible, sin embargo, solo 5 de ellas pueden ejecutarse al mismo tiempo.
Quería hacerlo usando Promise.race por lo que la implementación no es la mejor. El problema es que la ejecución del código no se detiene en await . Esperaría que esa variable de counter se reduzca solo cuando se resuelva la promesa, pero no espera a que se resuelva la promesa. El código tampoco se detiene en Promise.all , lo que me hace pensar que mi comprensión de las promesas no es adecuada. El código está debajo y la función en cuestión es runPromises .
async function runPromises(promises, limit) { const LIMIT = limit || 10; let promsCopy = promises.slice(); let counter = 0; let queue = []; while (promsCopy.length !== 0) { if (counter < LIMIT) { let prom = promsCopy.shift(); if (prom) { queue.push(prom()); counter += 1; if (counter >= LIMIT) { let [completed] = await Promise.race( queue.map((p) => p.then((_) => [p])) ); queue.splice(queue.indexOf(completed), 1); counter -= 1; } } } } await Promise.all(queue); } // the code below is just for testing const asyncFuncLong = () => { return new Promise((resolve, reject) => { setTimeout(() => { resolve(); }, 6000); }); }; const asyncFuncShort = () => { return new Promise((resolve, reject) => { setTimeout(() => { resolve(); }, 1000); }); }; let fns = [ asyncFuncLong, asyncFuncLong, asyncFuncLong, asyncFuncLong, asyncFuncLong, asyncFuncLong, asyncFuncLong, asyncFuncLong, asyncFuncLong, asyncFuncLong, asyncFuncLong, asyncFuncLong, asyncFuncLong, asyncFuncLong, asyncFuncLong, asyncFuncLong, ]; let start = Date.now(); runPromises(fns, 10).then(() => { console.log(Date.now() - start); });Editar: arreglado. Todo funciona ahora. ¡Gracias a los dos!
La matriz fns es una lista de funciones. Esas funciones devuelven objetos Promise . Luego está pasando esa lista de funciones a su función runPromises , que parece querer tomar una lista de objetos Promise como argumento. Pero le estás pasando una lista de funciones.
Mis sugerencias son
cambie la función runPromises para que realmente llame a prom() en algún momento (o simplemente use un mapa, como const r = await Promise.all(queue.map((fn) => { return fn(); })); ), o
cambie la definición de fns a algo así como let fns = [ asyncFuncLong(), asyncFuncShort(), asyncFuncLong(), ... ]; .