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

140
Vistas
Constructor de promesa con llamada de rechazo frente a error de lanzamiento

En el siguiente código:

 var p1 = new Promise(function (resolve, reject) { throw 'test1'; }); var p2 = new Promise(function (resolve, reject) { reject('test2'); }); p1.catch(function (err) { console.log(err); // test1 }); p2.catch(function (err) { console.log(err); // test2 });

¿Hay alguna diferencia entre usar el reject (en p2 ) de la API de Promise y arrojar un error (en p1 ) usando throw ?

¿Es exactamente lo mismo?

Si es lo mismo, ¿por qué entonces necesitamos una devolución de llamada de reject ?

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

¿Hay alguna diferencia entre usar el reject (en p2 ) de la API de Promise y arrojar un error (en p1 ) usando throw ?

Sí, no puede usar throw de forma asincrónica, mientras que el reject es una devolución de llamada. Por ejemplo, algún tiempo de espera:

 new Promise(_, reject) { setTimeout(reject, 1000); });

¿Es exactamente lo mismo?

No, al menos no cuando otro código sigue a su declaración. throw completa inmediatamente la función de resolución, mientras que llamar a reject continúa la ejecución normalmente, después de haber "marcado" la promesa como rechazada.

Además, los motores pueden proporcionar información de depuración de excepciones diferente si throw objetos de error.

Para su ejemplo específico, tiene razón en que p1 y p2 son indistinguibles desde el exterior.

over 4 years ago · Santiago Trujillo Denunciar

0

Sé que esto es un poco tarde, pero realmente no creo que ninguna de estas respuestas responda completamente las preguntas que tenía cuando encontré esto. Aquí hay un ejemplo más completo para jugar.

 var p1 = new Promise(function (resolve, reject) { throw 'test 1.1'; //This actually happens console.log('test 1.1.1'); //This never happens reject('test 1.2'); //This never happens because throwing an error already rejected the promise console.log('test 1.3'); //This never happens }); var p2 = new Promise(function (resolve, reject) { reject('test 2.1'); //This actually happens console.log('test 2.1.1'); //This happens BEFORE the Promise is rejected because reject() is a callback throw 'test 2.2'; //This error is caught and ignored by the Promise console.log('test 2.3'); //This never happens }); var p3 = new Promise(function (resolve, reject) { setTimeout(function() { reject('test 3.1');}, 1000); //This never happens because throwing an error already rejected the promise throw('test 3.2'); //This actually happens console.log('test 3.3'); //This never happens }); var p4 = new Promise(function (resolve, reject) { throw('test 4.1'); //This actually happens setTimeout(function() { reject('test 4.2');}, 1000); //This never happens because throwing an error already rejected the promise console.log('test 4.3'); //This never happens }); var p5 = new Promise(function (resolve, reject) { setTimeout(function() { throw('test 5.1');}, 1000); //This throws an Uncaught Error Exception reject('test 5.2'); //This actually happens console.log('test 5.3'); //This happens BEFORE the Promise is rejected because reject() is a callback }); var p6 = new Promise(function (resolve, reject) { reject('test 6.1'); //This actually happens setTimeout(function() { throw('test 6.2');}, 1000); //This throws an Uncaught Error Exception console.log('test 6.3'); //This happens BEFORE the Promise is rejected because reject() is a callback }); p1.then(function (resolve) { console.log(resolve, "resolved") }, function (reject) { console.log(reject, "rejected") }).catch(function (err) { console.log(err, "caught"); // test1 }); p2.then(function (resolve) { console.log(resolve, "resolved") }, function (reject) { console.log(reject, "rejected") }).catch(function (err) { console.log(err, "caught"); // test2 }); p3.then(function (resolve) { console.log(resolve, "resolved") }, function (reject) { console.log(reject, "rejected") }).catch(function (err) { console.log(err, "caught"); // test3 }); p4.then(function (resolve) { console.log(resolve, "resolved") }, function (reject) { console.log(reject, "rejected") }).catch(function (err) { console.log(err, "caught"); // test4 }); p5.then(function (resolve) { console.log(resolve, "resolved") }, function (reject) { console.log(reject, "rejected") }).catch(function (err) { console.log(err, "caught"); // test5 }); p6.then(function (resolve) { console.log(resolve, "resolved") }, function (reject) { console.log(reject, "rejected") }).catch(function (err) { console.log(err, "caught"); // test6 });

over 4 years ago · Santiago Trujillo Denunciar

0

No, no lo hay, los dos son completamente idénticos. La única diferencia y por qué necesitamos reject es cuando necesita rechazar de forma asíncrona; por ejemplo, si está convirtiendo una API basada en devolución de llamada, es posible que deba señalar un error asíncrono.

 var p = new Promise(function(resolve, reject){ someCallbackApi(function(err, data){ if(err) reject(err); // CAN'T THROW HERE, non promise context, async. else resolve(data); }); });
over 4 years ago · Santiago Trujillo 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