Tengo un problema en el que tengo una función que debería dormir durante un tiempo designado si los datos no se completan en una matriz, antes de pasar a la siguiente iteración.
Por alguna razón, el sueño se salta y continúa sin dormir.
const sleep = (millis) => new Promise((resolve) => setTimeout(resolve("done"), millis)); async function getBackupData(ID, Data) { const sleeptime = 60; const attempts = 10; let urlArray; for (let i = 0; i < attempts + 1; i += 1) { if (i === attempts) { throw new Error("Download URL not available"); } urlArray = await getDownloadUrls(ID, data); if (urlArray.length > 0) { break; } console.log(`${i} - Download url not available yet: sleeping ${sleeptime} seconds`); await sleep(sleeptime * 1000); } console.log(`returning ${urlArray[0]}`); return urlArray[0]; }producción:
0 - Download url not available yet: sleeping 60 seconds 1 - Download url not available yet: sleeping 60 seconds 2 - Download url not available yet: sleeping 60 seconds 3 - Download url not available yet: sleeping 60 seconds 4 - Download url not available yet: sleeping 60 seconds 5 - Download url not available yet: sleeping 60 seconds 6 - Download url not available yet: sleeping 60 seconds 7 - Download url not available yet: sleeping 60 seconds 8 - Download url not available yet: sleeping 60 seconds 9 - Download url not available yet: sleeping 60 seconds Unhandled Rejection at: Promise Promise { <rejected> Error: Download URL not availableEsto debería estar durmiendo durante 60 segundos en cada iteración, pero esto toma solo unos segundos para completarse como está ... ¿Alguien puede echar un vistazo para ver qué está pasando?
const sleep = (millis) => new Promise((resolve) => setTimeout(resolve("done"), millis)); llama a resolve("done") inmediatamente y pasa el resultado de la llamada resolve("done") como parámetro a setTimeout .
Puede pasar la función resolve como parámetro a setTimeout (no hay una necesidad real de resolver con done ):
const sleep = (millis) => new Promise((resolve) => setTimeout(resolve, millis)); O si realmente desea done con el uso de una función de flecha:
const sleep = (millis) => new Promise((resolve) => setTimeout(() => resolve("done"), millis));