Por lo que he entendido, hay tres formas de llamar a un código asincrónico:
- Eventos, p. Ej.
request.on("event", callback);
- Callbacks, p. Ej.
fs.open(path, flags, mode, callback);
- Promesas
Encontré la biblioteca de promesa de nodo pero no la consigo.
¿Podría alguien explicar de qué se tratan las promesas y por qué debería usarlas?
Además, ¿por qué se eliminó de Node.js?
javascript
node.js
promise
ajsie
fuente
fuente
Respuestas:
Las promesas en node.js prometieron hacer algo de trabajo y luego tuvieron devoluciones de llamada separadas que se ejecutarían para el éxito y el fracaso, así como para manejar los tiempos de espera. Otra forma de pensar en las promesas en node.js era que eran emisores que solo podían emitir dos eventos: éxito y error.
Lo bueno de las promesas es que puedes combinarlas en cadenas de dependencia (haz la promesa C solo cuando se completen la promesa A y la promesa B).
Al eliminarlos del núcleo node.js, creó la posibilidad de construir módulos con diferentes implementaciones de promesas que pueden ubicarse en la parte superior del núcleo. Algunos de estos son promesa de nodo y futuros .
fuente
Dado que esta pregunta todavía tiene muchas opiniones (como la mía), quería señalar que:
fuente
Una promesa es una "cosa" que representa los resultados "eventuales" de una operación, por así decirlo. El punto a tener en cuenta aquí es que, abstrae los detalles de cuándo sucede algo y le permite centrarse en lo que debería suceder después de que algo suceda. Esto dará como resultado un código limpio y fácil de mantener donde, en lugar de tener una devolución de llamada dentro de una devolución de llamada dentro de una devolución de llamada, su código se verá algo así:
La especificación de las promesas establece que una promesa
El método debe devolver una nueva promesa que se cumpla cuando finalice la devolución de llamada de SuccessHandler o la falla. Esto significa que puede encadenar promesas cuando tiene un conjunto de tareas asíncronas que deben realizarse y asegurarse de que la secuencia de operaciones está garantizada como si hubiera utilizado devoluciones de llamada. Entonces, en lugar de pasar una devolución de llamada dentro de una devolución de llamada dentro de una devolución de llamada, el código con promesas encadenadas se ve así:
Para saber más sobre las promesas y por qué son súper geniales, visite el blog de Domenic: http://domenic.me/2012/10/14/youre-missing-the-point-of-promises/
fuente
Este nuevo tutorial sobre Promesas del autor de PouchDB es probablemente el mejor que he visto en mi vida. Cubre sabiamente los errores clásicos de novato que muestran patrones de uso correctos e incluso algunos antipatrones que todavía se usan comúnmente, ¡incluso en otros tutoriales!
¡Disfrutar!
PD: No respondí algunas otras partes de esta pregunta, ya que han sido bien cubiertas por otros.
fuente
Mike Taulty tiene una serie de videos , cada uno de ellos de menos de diez minutos de duración, que describe cómo funciona la biblioteca WinJS Promise.
Estos videos son bastante informativos, y Mike logra mostrar el poder de la API Promise con algunos ejemplos de código bien elegidos.
El tratamiento de cómo se manejan las excepciones es particularmente bueno.
A pesar de las referencias de WinJs, esta es una serie de videos de interés general, porque la API Promise es ampliamente similar en todas sus implementaciones.
RSVP es una implementación ligera de Promise que supera el conjunto de pruebas Promise / A +. Me gusta bastante la API, porque es similar en estilo a la interfaz WinJS.
Actualización abr-2014
Por cierto, la biblioteca WinJS ahora es de código abierto .
fuente
deferreds
yresolve
, ydeferred.promise.then
, y predefinir depromiseActions
en el popular Q documentación de la biblioteca. ¿Hay alguna posibilidad de que sepas algo tan sencillo para Node.js ?Otra ventaja de las promesas es que el manejo de errores y el lanzamiento y captura de excepciones es mucho mejor que tratar de manejar eso con devoluciones de llamada.
La biblioteca de bluebird implementa promesas y le brinda excelentes trazas largas de la pila, es muy rápida y advierte sobre errores no detectados. También es más rápido y usa menos memoria que las otras bibliotecas de promesa, de acuerdo con http://bluebirdjs.com/docs/benchmarks.html
fuente
¿Qué es exactamente una promesa?
Una promesa es simplemente un objeto que representa el resultado de una operación asíncrona. Una promesa puede ser en cualquiera de los siguientes 3 estados:
pendiente :: Este es el estado inicial, significa que la promesa no se cumple ni se rechaza.
cumplido :: Esto significa que la promesa se ha cumplido, significa que el valor representado por la promesa está listo para ser utilizado.
rechazado :: Esto significa que las operaciones fallaron y, por lo tanto, no pueden cumplir la promesa. Además de los estados, hay tres entidades importantes asociadas a las promesas que realmente necesitamos entender
función ejecutor :: la función ejecutor define la operación asíncrona que debe realizarse y cuyo resultado está representado por la promesa. Comienza la ejecución tan pronto como se inicializa el objeto de promesa.
resolve :: resolve es un parámetro pasado a la función ejecutor, y en caso de que el ejecutor se ejecute con éxito, esta resolución se llama pasar el resultado.
rechazar :: rechazar es otro parámetro pasado a la función ejecutora, y se usa cuando falla la función ejecutora. La razón de la falla se puede pasar al rechazo.
Entonces, cada vez que creamos un objeto de promesa, tenemos que proporcionar Ejecutor, Resolver y Rechazar.
Referencia :: Promesas
fuente
También he estado buscando promesas en node.js recientemente. Hasta la fecha, when.js parece ser el camino a seguir debido a su velocidad y uso de recursos, pero la documentación sobre q.js me dio una mejor comprensión. Entonces use when.js pero los documentos q.js para entender el tema.
Del archivo léame de q.js en github:
fuente
El objeto de promesa representa la finalización o falla de una operación asincrónica.
Entonces, para implementar una promesa, necesita dos partes:
1. Creando promesa:
2. Promesa de manejo:
fuente