una termine que promesas funcion esperar await async asincronia anidadas node.js promise q

node.js - termine - promesas typescript



Cuándo rechazar/resolver una promesa (2)

Estoy pensando cuándo exactamente necesito rechazar una promesa. Encontré un par de preguntas sobre este tema, pero no pude encontrar una respuesta adecuada. ¿Cuándo debería rechazar una promesa?

Este artículo http://howtonode.org/6666a4b74d7434144cff717c828be2c3953d46e7/promises dice:

  • Resolver: una Promesa exitosa se ''resuelve'', lo que invoca a los oyentes de éxito que están esperando y recuerda el valor que se resolvió para los oyentes de éxito futuros que están adjuntos. La resolución se correlaciona con un valor devuelto.
  • Rechazar: cuando se encuentra una condición de error, se "rechaza" una Promesa que invoca a los oyentes de error que están esperando y recuerda el valor que se rechazó para los oyentes de error futuros que están adjuntos. El rechazo se correlaciona con una excepción lanzada.

¿Es esta la guía principal? ¿Ese solo rechaza una promesa si ocurre una excepción?

Pero en el caso de una función como

findUserByEmail()

Esperaría que la función devuelva un usuario, para que pueda continuar la cadena sin verificar el resultado

findUserByEmail() .then(sendWelcomeBackEmail) .then(doSomeNiceStuff) .then(etc..)

¿Cuáles son las mejores / prácticas comunes?


Sé de dónde vienes. La documentación Q y Q puede hacerle creer que el rechazo diferido / promesa tiene que ver con el manejo de excepciones.

Este no es necesariamente el caso.

Un diferido puede ser rechazado por cualquier razón que requiera su aplicación.

Las diferidas / promesas tienen que ver con manejar las respuestas de los procesos asincrónicos, y cada proceso asincrónico puede generar una variedad de resultados, algunos de los cuales son "exitosos" y otros "fallidos". Puede optar por rechazar su diferido, cualquiera sea el motivo, independientemente de si el resultado fue nominalmente exitoso o no, y sin excepción alguna vez lanzado, ya sea en javascript o en el proceso asincrónico.

También puede optar por implementar un tiempo de espera en un proceso asíncrono, en cuyo caso puede optar por rechazar un diferido sin una respuesta (exitosa o fallida) que se haya recibido. De hecho, para los tiempos de espera, esto es lo que normalmente elegirías hacer.


En general, puede pensar en rechazar como análogo a un throw síncrono y cumplir como análogo a un return sincrónico. Debe rechazar siempre que la función no tenga éxito de alguna manera. Eso podría ser un tiempo de espera, un error de red, una entrada incorrecta, etc.

Rechazar una promesa, al igual que lanzar una excepción, es útil para el flujo de control. No tiene que representar un error verdaderamente inesperado; puede representar un problema que anticipa y maneja por completo:

function getProfile(email) { return getProfileOverNetwork(email) .then(null, function (err) { //something went wrong getting the profile if (err.code === ''NonExistantUser'') { return defaultUser; } else if (profileCached(email)) { return getProfileFromCache(email);//fall back to cached profile } else { throw err;//sometimes we don''t have a nice way of handling it } }) }

El rechazo nos permite saltar sobre el comportamiento normal de éxito hasta que llegamos a un método que sabe cómo manejarlo. Como otro ejemplo, podríamos tener alguna función que está profundamente anidada en la parte inferior de la pila de aplicaciones, que rechaza. Esto podría no ser manejado hasta la parte superior de la pila, donde podríamos registrarlo. El punto es que los rechazos viajan por la pila al igual que las excepciones en el código síncrono.

En general, siempre que sea posible, si está luchando por escribir algún código asíncrono, debería pensar "¿qué escribiría si fuera sincrónico?". Por lo general, es una transformación bastante simple para llegar a eso, al equivalente prometido. A nice example of where rejected promises might be used is in an método de exists`:

function exists(filePath) { return stat(filePath) //where stat gets last updated time etc. of the file .then(function () { return true; }, function () { return false; }) }

Observe cómo en este caso, el rechazo es totalmente esperado y simplemente significa que el archivo no existe. Observe también cómo es paralela a la función sincrónica:

function existsSync(filePath) { try { statSync(filePath); return true; } catch (ex) { return false; } }

Tu ejemplo

Volviendo a tu ejemplo:

Normalmente elegiría rechazar la promesa resultante de findUserByEmail si no se encuentra un usuario. Es algo que esperas que ocurra a veces, pero es la excepción de la norma, y ​​probablemente debería manejarse de manera similar a todos los demás errores. De manera similar, si estuviera escribiendo una función sincrónica, haría que throw una excepción.

A veces puede ser útil simplemente devolver null , pero esto dependería de la lógica de su aplicación y probablemente no sea la mejor manera de hacerlo.