Cuando se nos habla de promesas se quiere hacer referencia a algo que no ha pasado todavía y que puede llegar a ocurrir en un futuro. En la programación asíncrona también existe algo parecido con el mismo nombre "promise", y representa un dato o un valor no conocido pero que en algún momento puede llegar a estar.
Para entendernos mejor, supongamos que queremos concatenar (unir) el contenido de dos webs diferentes, la manera más simple que nos viene a la cabeza sería:
[code language="javascript"] function descargarWeb(web){ //descargar el contenido return contenido; } var web1 = descargarWeb(“web1”), web2 = descargarWeb(“web2”), contenido = web1+web2; [/code]Al hacerlo de esta manera ocurrirá que, a no ser que tengas una línea de Internet como la de la NASA, cuando se ejecute la suma (web1+web2) pueden no haberse cargado todavía los contenidos de las dos páginas, por lo que no obtendríamos el resultado esperado. Que las cosas funcionen a ratos no vale, así que habrá que mejorarlo, ¿pero cómo? Pues mediante el uso de una función que será utilizada como callback y que comprobará que hemos obtenido el contenido de las dos webs antes de concatenarlas. Algo así:
[code language="javascript"] var web1,web2,contenido; function descargarWeb(web, callback){ //Descargar el contenido callback(); } function comprobarYConcatenar(){ if(web1 && web2) contenido = web1+web2; } descargarWeb (“web1”, comprobarYConcatenar); descargarWeb (“web2”, comprobarYConcatenar); [/code]A partir de aquí ya tenemos nuestro problema solucionado ya que siempre se realizará la suma cuando se hayan cargado los datos de ambas webs, pero como no es una solución muy elegante vamos a ver el mismo ejemplo utilizando las promesas de jQuery. Una promesa se caracteriza por su estado, el cual siempre se inicia en un punto de espera (pending), para posteriormente pasar a uno de los dos siguientes estados:
Ahora que entendemos qué es una promesa, necesitamos saber cuándo cambia de estado. Como toda promesa proviene de un objeto deferred (lo podemos definir como un trabajo no finalizado) disponemos de varias funciones (handlers) que nos permiten ejecutar nuestro código a medida que va cambiando el estado, estas funciones son: