¿Cual es la diferencia?
La .then()
llamada devolverá una promesa que será rechazada en caso de que la devolución de llamada arroje un error. Esto significa que, cuando su éxito logger
falla, el error se pasará a la siguiente .catch()
devolución de llamada, pero no a la fail
devolución de llamada que va junto con success
.
Aquí hay un diagrama de flujo de control :
Para expresarlo en código síncrono:
// some_promise_call().then(logger.log, logger.log)
then: {
try {
var results = some_call();
} catch(e) {
logger.log(e);
break then;
} // else
logger.log(results);
}
El segundo log
(que es como el primer argumento para .then()
) solo se ejecutará en caso de que no ocurra ninguna excepción. El bloque etiquetado y la break
declaración se sienten un poco extraños, esto es realmente lo que tiene Python try-except-else
para (¡lectura recomendada!).
// some_promise_call().then(logger.log).catch(logger.log)
try {
var results = some_call();
logger.log(results);
} catch(e) {
logger.log(e);
}
El catch
registrador también manejará las excepciones de la llamada exitosa del registrador.
Demasiado para la diferencia.
No entiendo bien su explicación en cuanto al intento y atrapar
El argumento es que generalmente desea detectar errores en cada paso del procesamiento, y que no debe usarlo en cadenas. La expectativa es que solo tiene un controlador final que maneja todos los errores, mientras que, cuando usa el "antipatrón", los errores en algunas de las devoluciones de llamada no se manejan.
Sin embargo, este patrón es realmente muy útil: cuando desea manejar los errores que ocurrieron exactamente en este paso, y desea hacer algo completamente diferente cuando no ocurrió ningún error, es decir, cuando el error es irrecuperable. Tenga en cuenta que esto está ramificando su flujo de control. Por supuesto, esto a veces se desea.
¿Qué tiene de malo lo siguiente?
some_promise_call()
.then(function(res) { logger.log(res) }, function(err) { logger.log(err) })
Que tenías que repetir tu devolución de llamada. Prefieres querer
some_promise_call()
.catch(function(e) {
return e; // it's OK, we'll just log it
})
.done(function(res) {
logger.log(res);
});
También podría considerar usar .finally()
para esto.
then().catch()
es más legible, ya que no necesita buscar comas e investigar si esta devolución de llamada es correcta o incorrecta.