Tengo una función asíncrona que se llama que se repite en una matriz y llama a una función para cada elemento.
En este ejemplo, la función llega a un punto final de la API y necesito esperar a que finalice un elemento antes de pasar al siguiente.
Sin embargo, lo que sucede actualmente es que se llama a cada función aproximadamente al mismo tiempo, lo que está causando problemas en la respuesta de la API. Entonces necesito esperar 1 segundo entre cada solicitud.
Esto es lo que tengo actualmente
const delayedLoop = async () => { const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); const myAsyncFunc = async (i) => { console.log(`item ${i}`); await delay(0); return true; }; const arr = ['one', 'two', 'three']; const promises = arr.map( (_, i) => new Promise((resolve) => setTimeout(async () => { await myAsyncFunc(i); resolve(true); }, 1000), ), ); return Promise.all(promises); } const myFunc = async () => { console.log('START'); await delayedLoop(); console.log('FINISH'); } myFunc();Lo que sucede es;
STARTitem ${i} juntos (sin demora en el medio)FINISHlo que quiero que pase es
STARTitem 1item 2item 3FINISHVer JSFiddle para verlo en acción
Puedes hacerlo así, usando un bucle for simple:
const delayedLoop = async () => { const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); const myAsyncFunc = async (i) => { console.log(`item ${i}`); return true; }; const arr = ['one', 'two', 'three']; for(let i=0; i < arr.length; i++) { await myAsyncFunc(i); await delay(1000); } } const myFunc = async () => { console.log('START'); await delayedLoop(); console.log('FINISH'); } myFunc();