Eché un vistazo a las preguntas frecuentes sobre la promesa de bluebird , en la que menciona que .then(success, fail)
es un antipatrón . No entiendo bien su explicación en cuanto al intento y la captura. ¿Qué tiene de malo lo siguiente?
some_promise_call()
.then(function(res) { logger.log(res) }, function(err) { logger.log(err) })
Parece que el ejemplo sugiere lo siguiente como la forma correcta.
some_promise_call()
.then(function(res) { logger.log(res) })
.catch(function(err) { logger.log(err) })
¿Cual es la diferencia?
javascript
node.js
promise
bluebird
user2127480
fuente
fuente
then().catch()
es más legible, ya que no necesita buscar comas e investigar si esta devolución de llamada es correcta o incorrecta..catch
, no sabe qué paso causó el problema, dentro del últimothen
o en otro lugar de la cadena de promesa. Entonces tiene su propia desventaja.some_promise_call() .then(function fulfilled(res) { logger.log(res) }, function rejected(err) { logger.log(err) })
Respuestas:
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 éxitologger
falla, el error se pasará a la siguiente.catch()
devolución de llamada, pero no a lafail
devolución de llamada que va junto consuccess
.Aquí hay un diagrama de flujo de control :
Para expresarlo en código síncrono:
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 labreak
declaración se sienten un poco extraños, esto es realmente lo que tiene Pythontry-except-else
para (¡lectura recomendada!).El
catch
registrador también manejará las excepciones de la llamada exitosa del registrador.Demasiado para la diferencia.
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.
Que tenías que repetir tu devolución de llamada. Prefieres querer
También podría considerar usar
.finally()
para esto.fuente
.catch
va a detectar errores, incluso dentro de la función del éxito .. En lo personal, creo que este muy mal como usted termina con un punto de errores de entrada, que se puede obtener a partir de múltiples errores múltiples acciones, pero este es mi problema. ¡De todas formas, gracias por la información! ¿No tiene alguna herramienta de comunicación en línea que esté dispuesto a compartir para que pueda preguntar algunas cosas más? : PPromise
mecánico importante en este sitio..done()
no es parte del estándar, ¿verdad? Al menos MDN no enumera ese método. Seria útil.done
es una cosa de Bluebird que básicamente fue desaprobada por lathen
detección de rechazo no controlado.Los dos no son idénticos. La diferencia es que el primer ejemplo no detectará una excepción lanzada en su
success
controlador. Entonces, si su método solo debe devolver promesas resueltas, como suele ser el caso, necesita uncatch
controlador final (u otrothen
con unsuccess
parámetro vacío ). Claro, puede ser que suthen
controlador no haga nada que pueda fallar, en cuyo caso usar un parámetro de 2then
podría estar bien.Pero creo que el punto del texto al que se vinculó es que
then
es principalmente útil frente a las devoluciones de llamada en su capacidad de encadenar un montón de pasos asincrónicos, y cuando realmente hace esto, la forma de 2 parámetros dethen
sutilmente no se comporta como se esperaba , por la razón anterior. Es particularmente contraintuitivo cuando se usa a mitad de cadena.Como alguien que ha hecho muchas cosas complejas asincrónicas y se ha topado con rincones como este más de lo que me gustaría admitir, realmente recomiendo evitar este antipatrón e ir con el enfoque de controlador separado.
fuente
Al observar las ventajas y desventajas de ambos, podemos hacer una suposición calculada sobre cuál es la adecuada para la situación. Estos son los dos enfoques principales para implementar las promesas. Ambos tienen sus ventajas y desventajas
Ventajas
Desventajas
Ventajas
Desventajas
catch
si desea manejar los errores arrojados por la devolución de llamada exitosafuente
Explicación simple:
En ES2018
eso significa:
es igual
fuente
El uso le
.then().catch()
permite habilitar Promise Chaining, que se requiere para completar un flujo de trabajo. Es posible que deba leer alguna información de la base de datos, luego desear pasarla a una API asíncrona y luego manipular la respuesta. Es posible que desee insertar la respuesta nuevamente en la base de datos. Manejar todos estos flujos de trabajo con su concepto es factible pero muy difícil de administrar. La mejor solución será lathen().then().then().then().catch()
que recibe todos los errores en una sola captura y le permite mantener la facilidad de mantenimiento del código.fuente
Usa
then()
ycatch()
ayuda a encadenar el éxito y el controlador de fallas en la promesa.catch()
trabaja en promesa devuelto porthen()
. Lo maneja,then()
no soluciona esto).1. let promiseRef: Promise = this. aTimetakingTask (false); 2. promiseRef 3. .then( 4. (result) => { 5. /* successfully, resolved promise. 6. Work on data here */ 7. }, 8. (error) => console.log(error) 9. ) 10. .catch( (e) => { 11. /* successfully, resolved promise. 12. Work on data here */ 13. });
Tiene sentido porque la promesa devuelta por
then()
no tiene un error si una devolución de llamada se está haciendo cargo.fuente
catch
devolución de llamada parece incorrecta.En lugar de palabras, buen ejemplo. Código siguiente (si se resuelve la primera promesa):
es idéntico a:
Pero con la primera promesa rechazada, esto no es idéntico:
fuente