Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

249
Views
¿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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!