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

101
Views
Tipo de espera setInterval

Necesito volver a ejecutar un bucle hecho a mano (porque necesito tiempo entre cada paso) 10 segundos después de que termine para siempre.

Entonces, después de algunos intentos, obtuve este código, pero no funciona porque se vuelve a ejecutar cada 10 segundos, no después de que finaliza el ciclo. Intenté pero la función asíncrona en el intervalo y puse todo mi código en una espera, pero no funcionó.

 async function refreshEDT() { let rows = appModel.getAll() let orderFiliere = {}; await rows.then((res) => { for (let i = 0; i < res.length; i++) { if (res[i].filiere in orderFiliere) { orderFiliere[res[i].filiere].push(res[i]) } else { orderFiliere[res[i].filiere] = [res[i]] } } }) return orderFiliere } let edt = refreshEDT() setInterval(() => { edt = refreshEDT() }, 1000 * 60 * 60) //ms to s to m to h setInterval(() => { edt.then((lessons) => { (function loop(i) { let lessons_key = Object.keys(lessons) setTimeout(() => { // processing things if (--i) loop(i); }, 1000 * 10) //ms to s to 10s })(Object.keys(lessons).length - 1) }) console.log(1) }, 1000 * 10) //ms to s to 10s

¿Tienes alguna solución?

Ty!

EDITAR Expliquemos lo que trato de hacer: obtengo cosas en mi base de datos, trato de clasificar por "filiere", una de mis columnas, y devuelvo ese objeto. Esos datos se recargan cada hora. Después de eso, necesito emitir con socket.io cada "filiere" con 10s entre ellos, y repetir eso.

about 4 years ago · Juan Pablo Isaza
3 answers
Answer question

0

Quizás el código sea más fácil de leer cuando envuelva setTimeout con una promesa de await .

 function sleep(ms) { return new Promise((resolve) => { setTimeout(resolve, ms); }); } async function refreshEDT() { const res = await appModel.getAll(); const orderFiliere = res.reduce((acc, value) => { const { filiere } = value; if (filiere in acc) { acc[filiere].push(value); } else { acc[filiere] = [value]; } return acc; }, {}); return orderFiliere; } // consider naming this (async () => { let edt = refreshEDT(); setInterval(() => { edt = refreshEDT(); }, 1000 * 60 * 60); while (true) { const lessons = await edt; for (const lessons_key of Object.keys(lessons)) { await sleep(1000 * 10); // processing things } // repeat after 10 seconds await sleep(1000 * 10); } })();

Con ES2022, puede usar Array.prototype.groupBy() para simplificar su implementación de refreshEDT() :

 async function refreshEDT() { const res = await appModel.getAll(); const orderFiliere = res.groupBy(({ filiere }) => filiere); return orderFiliere; }
about 4 years ago · Juan Pablo Isaza Report

0

Podría intentar usar setTimeout para llamar a su función nuevamente.

 const myFunc = () => { // processing things setTimeout(myFunc , 10000) } myFunc();
about 4 years ago · Juan Pablo Isaza Report

0

Creo que esto podría ayudar si entendí el problema correctamente:

 const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); async yourFunction() { const secondsToWait: number = 10; let i = 0; for (let item of List) { // Do stuff if (i === list.length -1) { await wait(secondsToWait*1000); yourFunction(); } i++; } }
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!