Tengo una API REST codificada con Node.js y hay una ruta que aplica los derechos NTFS a las carpetas. La solicitud puede tardar 1 segundo pero también puede durar varios minutos (depende del tamaño de la carpeta).
En resumen, si los derechos tardan menos de 5 segundos en aplicarse, quiero devolver el valor con el código 200.
Si los derechos no han terminado de aplicarse me gustaría devolver el valor con el código 202
... inProgress = true; ApplyRights() .then(() => { inProgress = false } // Here I want to return as fast inProgress = false otherwise wait a bit but max 5s return ...;Traté de esperar un poco con setTimeout así:
const sleep = s => new Promise(resolve => { setTimeout(resolve, s * 1000) }); let nbCheck = 0; while (inProgress && nbCheck < 5){ await sleep(1) nbCheck++; }Pero setTimeout no se llama antes del final de mi promesa anterior (ApplyRights). Leí aquí que la promesa se ejecuta antes de setTimeout
Entonces, traté de encontrar una solución sin setTimeout e intenté esto: (Sé que no es muy elegante)
let dateStop = Date.now() + 5 * 1000; while (dateStop = Date.now() && inProgress){} return ...;Pero en este caso, el .then() de ApplyRights solo se alcanza al final de los 5s.
¿Hay alguna manera de dejar que mi promesa ApplyRights haga su trabajo? Y si el trabajo lleva tiempo, espere un máximo de 5 segundos antes de devolver la respuesta. Si el trabajo es rápido, quiero devolver las respuestas sin esperar.
Puedes usar Promise.race :
Promise.race([ApplyRights(), sleep(5)]).then(result => { if (result === undefined) { // Timeout of 5 seconds occurred // Some message to the user? } else { // Got reply within 5 seconds // Do something with the result } }); Sin embargo, tenga en cuenta que esto no interrumpe el trabajo de ApplyRights() , que eventualmente aún puede hacer el trabajo.