Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

227
Vistas
¿Evitar una excepción no detectada cuando se rechaza una promesa debido a un tiempo de espera?

Tengo una situación en mi programa node.js donde tengo una serie de promesas. Estoy preparado para esperar un máximo de 200 ms para que se cumpla cada promesa en la matriz, si no se cumple para entonces, quiero que se rechace.

El código que escribí para esto funciona cuando ejecuto mi script en la terminal usando node.js sin un depurador adjunto.

Sin embargo, cuando depuro el mismo script usando el código VS, se detiene tan pronto como se rechaza una promesa debido al tiempo de espera. El depurador afirma que el rechazo es una excepción no detectada.

¿Cómo puedo cambiar el código que tengo para que haga exactamente lo que hace ahora, pero una promesa rechazada no cause una excepción?

Intenté agregar try{} catch{} por todas partes, pero parece que no puedo encontrar una solución.

Aquí hay un ejemplo reproducible mínimo de mi problema (el depurador se queja del reject( "timeout" ) ):

 async function delayedPromise(delay) { await new Promise((res) => setTimeout(res, delay)); return "success"; } function rejectAfterDelay(ms) { return new Promise((_, reject) => setTimeout(() => { reject("timeout"); }, ms)); } async function main() { // Create array of promises. promArr = []; promArr.push(delayedPromise(100)); promArr.push(delayedPromise(200)); promArr.push(delayedPromise(300)); promArr.push(delayedPromise(400)); promArr.push(delayedPromise(500)); // Wait for all promises to either get fulfilled or get rejected after 200 ms. const msMaxTime = 200; const result = await Promise.allSettled( promArr.map(promise => Promise.race([promise, rejectAfterDelay(msMaxTime)])) ); console.log(result); } main()

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

En lugar de competir con una promesa con una promesa de corta duración (rejectAfterDelay), podemos envolver la promesa en una promesa de corta duración:

 async function delayedPromise(delay) { return new Promise((res) => setTimeout(res, delay, 'success')); } // wrap the promise instead of racing it function rejectAfterDelay(promise, ms) { return new Promise((resolve, reject) => { setTimeout(reject, ms, 'timeout'); // forward the reasons to the wrapper promise.then(reason => resolve(reason)) .catch(err => reject(err)); }); } async function main() { // Create array of promises. promArr = []; promArr.push(delayedPromise(100)); promArr.push(delayedPromise(200)); promArr.push(delayedPromise(300)); promArr.push(delayedPromise(400)); promArr.push(delayedPromise(500)); // Wait for all promises to either get fulfilled or get rejected after 200 ms. const msMaxTime = 200; const result = await Promise.allSettled( promArr.map(promise => { //return Promise.race([promise, rejectAfterDelay(msMaxTime)]); return rejectAfterDelay(promise, msMaxTime); }) ); console.log(result.map(r => r.value ? r.value : r.reason)); } main()

Con esto, el depurador no se queja cuando se selecciona la opción Uncaught Exceptions no detectadas.
Además, dependiendo de su situación, en lugar de setTimeout(reject, ms, 'timeout') puede usar setTimeout(resolve, ms, 'timeout') para que falle correctamente.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda