Estoy tratando de hacer un ciclo para obtener información en una API, primero necesito este ciclo para esperar a que finalice la solicitud y luego continuar con el siguiente valor de matriz, después de que finalice el ciclo, luego necesito que llame a esa función de nuevo cada 5 segundos, pero solo después de que termine la llamada anterior.
Algo como esto:
let ids = [1, 2]; async function getInfoAPI(ids) { for (const id of ids){ const apiInfo = await fetch(`https://apiurl/${id}`); const infoJSON = await apiInfo.json(); //Do more things here } }Ahora necesito llamar a la función y esperar a que termine el ciclo. Una vez que se complete el ciclo, espere 5 segundos y vuelva a llamar a la función getInfoFromAPI. Intenté setInterval pero si el bucle, por alguna razón, tarda más de 5 segundos en responder, se volverá a llamar a getInfoFromAPI incluso si no finalizó el bucle anterior.
setInterval(function(){ getInfoAPI(ids); }, 5000);¿Hay alguna manera de que pueda hacer eso usando promesas o algo así?
Gracias
Puedes hacer algo como esto:
function run() { getInfo(...).then(() => { setTimeout(run, 5000) }); } run().catch(err => { console.log(err); }); O prefiero usar una versión prometida de setTimeout() . En la última versión de nodejs, puede usar timersPromises.setTimeout() y devuelve una promesa:
import { setTimeout } from 'timers/promises'; async function run() { await getInfo(...) await setTimeout(5000); return run(); } run().catch(err => { console.log(err); }); O use un ciclo while con await :
import { setTimeout } from 'timers/promises'; async function run() { while (true) { await getInfo(...) await setTimeout(5000); } } run().catch(err => { console.log(err); });Puede lograr esto importando el setTimeout basado en promesas que se envía con NodeJs 16+ y usándolo de la siguiente manera:
Importar:
import { setTimeout } from "timers/promises"Usar:
while (true) { await getInfoAPI(ids); await setTimeout(5000); }Usar recursividad:
async function getInfoPeriodically() { await getInfoAPI(ids); setTimeout(() => { getInfoPeriodically() }, 5000); }Puede agregar los parámetros para personalizar esta función/pasar valores, pero esta es la idea.