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.
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; }Podría intentar usar setTimeout para llamar a su función nuevamente.
const myFunc = () => { // processing things setTimeout(myFunc , 10000) } myFunc();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++; } }