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()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.