Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

251
Vistas
¿Por qué la ejecución no se detiene en await (async/await JS)?

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!

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

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(), ... ]; .

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda