Una vez que se lleva un tiempo programando en JavaScript, sobre todo, utilizando el modelo asíncrono que propone la comunicación AJAX, aparece un término muy peculiar, promises (Promises). ¿Pero qué realmente significa esto? . Promise ó Future es una abstracción que se le es dada a una operación que puede que no haya sucedido. Bien, ¿dónde está el misterio?. Qué pasa si desea ejecutar código simultáneo a dicha operación. Téngase por supuesto que la operación es de entrada y salida, una consulta y que demora al menos 1 minuto en ejecutarse…¡exactamente! Se tendría que esperar 1 minuto para seguir ejecutando el resto del código.

result = query(…); // 1 minuto!.

Un primer momento, pudiera ser lanzar una re-llamada (callback) justo después de haberse terminado la operación.

query(function(result) { }, …); // Se ejecuta en un minuto.

Pero el problema de esta forma, es que transforma la legibilidad del programa, ya que entenderlo no es tan trivial, como leer programas secuenciales o sincrónicos de la forma común de hacer A, luego B.

Esta abstracción, permite bloquear cada operación que dependa del Promise dando paso a que se ejecute todo el código que pueda ser simultáneo, es decir, que no presenta dependencia alguna. Y es entonces cuando en vez de re-llamadas, utilizando Promise, es posible realizar un entendimiento secuencial a la ejecución de las instrucciones.

result_promise = query(…); // se obtiene un promise.

Pero entonces, ¿cómo funciona realmente?. Pues al ejecutar la operación costosa, se devuelve un objeto Promise y cuando se intenta a acceder a su resultado se bloquea el acceso hasta que llegue el resultado o estado. Sin embargo, el código que no depende del resultado del Promise se puede seguir ejecutando.

  1. result_promise = query(…); // se obtiene un promise.
  2. do_something_else(); // Se ejecuta al instante.
  3. do_something_with(result_promise); // Se bloquea durante un minuto.

Siguiendo este patrón, es posible codificar  aplicaciones legibles, como aplicaciones síncronas, pero con un comportamiento completamente asíncrono. Permite prescindir de funciones anónimas, las cuales inciden en el rendimiento, así como lidiar con operaciones costosas en ejecución.

Fuente: https://www.quora.com/What-is-the-promise-pattern

Otras lecturas:

https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/Promesa

http://modernjavascript.blogspot.com/2013/09/promise-patterns.html

Anuncios