Las promesas pueden "manejarse" después de ser rechazadas. Es decir, se puede llamar la devolución de llamada de rechazo de una promesa antes de proporcionar un controlador de captura. Este comportamiento es un poco molesto para mí porque uno puede escribir ...
var promise = new Promise(function(resolve) {
kjjdjf(); // this function does not exist });
... y en este caso, la Promesa es rechazada en silencio. Si uno olvida agregar un controlador catch, el código continuará ejecutándose silenciosamente sin errores. Esto podría conducir a errores persistentes y difíciles de encontrar.
En el caso de Node.js, se habla de manejar estos rechazos de Promesa no manejados y reportar los problemas. Esto me lleva a ES7 async / wait. Considere este ejemplo:
async function getReadyForBed() {
let teethPromise = brushTeeth();
let tempPromise = getRoomTemperature();
// Change clothes based on room temperature
let temp = await tempPromise;
// Assume `changeClothes` also returns a Promise
if(temp > 20) {
await changeClothes("warm");
} else {
await changeClothes("cold");
}
await teethPromise;
}
En el ejemplo anterior, suponga que se rechazó el mensaje toothPromise (Error: ¡sin pasta de dientes!) Antes de que se cumpliera getRoomTemperature. En este caso, habría un rechazo no prometido de Promise hasta que aguarden los dientes.
Mi punto es este ... si consideramos que los rechazos de promesas no manejadas son un problema, las promesas que luego son manejadas por una espera podrían ser reportadas inadvertidamente como errores. Por otra parte, si consideramos que los rechazos de Promesa no manejados no son problemáticos, los errores legítimos podrían no ser reportados.
¿Pensamientos sobre esto?
Esto está relacionado con la discusión que se encuentra en el proyecto Node.js aquí:
Comportamiento predeterminado de detección de rechazo no controlado
si escribe el código de esta manera:
function getReadyForBed() {
let teethPromise = brushTeeth();
let tempPromise = getRoomTemperature();
// Change clothes based on room temperature
return Promise.resolve(tempPromise)
.then(temp => {
// Assume `changeClothes` also returns a Promise
if (temp > 20) {
return Promise.resolve(changeClothes("warm"));
} else {
return Promise.resolve(changeClothes("cold"));
}
})
.then(teethPromise)
.then(Promise.resolve()); // since the async function returns nothing, ensure it's a resolved promise for `undefined`, unless it's previously rejected
}
Cuando se invoca getReadyForBed, creará sincrónicamente la promesa final (no devuelta), que tendrá el mismo error de "rechazo no controlado" que cualquier otra promesa (por supuesto, podría no ser nada, dependiendo del motor). (Me parece muy extraño que su función no devuelva nada, lo que significa que su función asincrónica produce una promesa para indefinido.
Si hago una Promesa en este momento sin una trampa, y agrego una más tarde, la mayoría de las implementaciones de "error de rechazo no controlado" en realidad retractarán la advertencia cuando más tarde la maneje. En otras palabras, async / await no altera la discusión del "rechazo no controlado" de ninguna manera que pueda ver.
Para evitar este problema, escriba el código de esta manera:
async function getReadyForBed() {
let teethPromise = brushTeeth();
let tempPromise = getRoomTemperature();
// Change clothes based on room temperature
var clothesPromise = tempPromise.then(function(temp) {
// Assume `changeClothes` also returns a Promise
if(temp > 20) {
return changeClothes("warm");
} else {
return changeClothes("cold");
}
});
/* Note that clothesPromise resolves to the result of `changeClothes`
due to Promise "chaining" magic. */
// Combine promises and await them both
await Promise.all(teethPromise, clothesPromise);
}
Tenga en cuenta que esto debería evitar cualquier rechazo de promesa no controlado.