Recibo el error UnhandledPromiseRejection, incluso envolví el código en el bloque Try Catch que uso await Prmomise.todos juntos aquí
const express = require('express'); const app = express(); const port = 3003; function testPromise(n) { return new Promise(async (res, rej) => { console.log(n); if (n > 10) { res(true); } else { setTimeout(() => { rej(n);; }, 1000) } }); } function test2(n) { return new Promise(async (res, rej) => { console.log(n); if (n > 10) { res(true); } else { setTimeout(() => { rej(n);; }, 10000) } }); } async function allCall(p) { await Promise.all(p); } app.get('/', async (req, res) => { try { let a = []; let b = []; a.push(testPromise(1)); await test2(1); a.push(testPromise(12)); // await Promise.all(a.map(m => m.then(() => { }).catch(err => { }))); await Promise.all(a); res.send('Hello World!'); } catch (err) { console.log('err'); console.log(err); res.status(400).send('xxxxxxxxxx!') } }) app.listen(port, () => { console.log(`Example app listening on port ${port}`) })No estoy seguro de por qué está arrojando el error.
[Rechazo de promesa no controlada: este error se originó al lanzar dentro de una función asíncrona sin un bloque catch, o al rechazar una promesa que no se manejó con .catch().
Por favor, explique por qué y cómo resolver esto.
Está recibiendo este error porque se rechazan 2 promesas, pero try/catch solo maneja una. La segunda promesa es rechazada pero no manejada.
1er rechazo: a.push(testPromise(1));
2º rechazo: await test2(1);
NOTA:
Ambas promesas se inician en paralelo.
try/catch solo funciona con async/await, si escribe promesa dentro de try/catch, no será manejado por el bloque catch.
try { Promise.reject("Something") } catch (error) { console.log('Not here'); } // Unhandled promise rejectionExplicación:
a.push(testPromise(1)); , inicia la ejecución y rechaza después de 1 segundo. Va a atrapar.await test2(1); porque no está esperando que la primera promesa se resuelva/rechace. Será rechazado después de 1 segundo y no será manejado por el bloque catch. irá a catch solo si usa con await. Si desea manejar el primer rechazo, debe usar .catch . después de 10 segundos, la segunda promesa es rechazada y manejada por el bloque catch.Solución
const r = await testPromise(1); await test2(1);Otra solución:
async (req, res) => { try { // a.push(testPromise(1)); await test2(1); let a = [testPromise(1), testPromise(12)]; await Promise.all(a); console.log("done"); } catch (err) { console.log("err"); console.log(err); } };