Estoy un poco confundido con esta pregunta. Creo que es porque te confundes con promise
y delegate
. En realidad son características de jQuery que no tienen nada que ver. Te explicaré cada una por separado:
delegate
delegate
es una característica de jQuery que se introdujo en jQuery 1.4.2. (Es una aproximación más agradable a la función live
que se añadió en jQuery 1.3). Resuelve un problema particular que viene con la modificación del DOM, y en particular con las llamadas AJAX.
Cuando se vincula un controlador de eventos, se vincula a una selección. Así que usted podría hacer $('.special').click(fn)
para enlazar un controlador de eventos a todos los miembros de la clase special
. Se vincula a esos elementos, por lo que si luego se quita la clase de uno de esos elementos, el evento seguirá siendo disparado. A la inversa, si añades la clase a un elemento (o añades un nuevo elemento en el DOM), no tendrá el evento vinculado.
Hay una característica de Javascript que mitiga esto llamada «burbujeo de eventos». Cuando se dispara un evento, primero el navegador notifica al elemento donde se originó el evento. Luego va hacia arriba en el árbol del DOM, y notifica a cada elemento antecesor. Esto significa que puedes enlazar un manejador de eventos en un elemento en lo alto del árbol DOM, y que los eventos se disparen en cualquier elemento hijo (incluso aquellos que no existen cuando el manejador fue enlazado).
delegate
es la implementación de jQuery de esto. Primero, se selecciona un elemento padre. Luego se especifica un selector – el manejador sólo se ejecutará si el elemento de origen coincide con este selector. Luego se especifica un tipo de evento, como click
, submit
, keydown
, al igual que con bind
. Finalmente se especifica el manejador del evento.
$('#containingElement').delegate('a.special', 'click', function() { alert('This will happen on all links with the special class');});
promise
promise
es otra adición relativamente reciente al conjunto de características de jQuery. Es parte del concepto Deferred
que se introdujo en jQuery 1.5. (Creo que la similitud de sonido entre «diferido» y «delegado» es probablemente la fuente de confusión). Es una forma de abstraer las complicaciones del código asíncrono. El mejor ejemplo de esto es con las llamadas AJAX, ya que el objeto devuelto por $.ajax
es un objeto Deferred
. Por ejemplo:
$.ajax({ url: 'somepage.cgi', data: {foo: 'bar'}}).done(function() { // this will be run when the AJAX request succeeds}).fail(function() { // this will be run when the AJAX request fails}).always(function() { // this will be run when the AJAX request is complete, whether it fails or succeeds}).done(function() { // this will also be run when the AJAX request succeeds});
Así que en muchos aspectos es lo mismo que vincular los manejadores de éxito en la llamada $.ajax
, excepto que puedes vincular más de un manejador, y puedes vincularlos después de la llamada inicial.
Otro momento en el que sería útil tratar de forma asíncrona es con las animaciones. Puedes proporcionar callbacks a las funciones, pero sería mejor hacerlo con una sintaxis similar al ejemplo de AJAX que he proporcionado anteriormente.
En jQuery 1.6, esta funcionalidad se hizo posible, y promise
es parte de esta implementación. Llamas a promise
en una selección de jQuery, y obtendrás un objeto al que puedes vincular manejadores de eventos, cuando todas las animaciones en el objeto se hayan completado.
Por ejemplo:
$('div.special').fadeIn(5000).promise().then(function() { // run when the animation succeeds}).then(function() { // also run when the animation succeeds});
De nuevo, esto es similar en efecto a los métodos tradicionales, pero añade flexibilidad. Puedes enlazar los manejadores más tarde, y puedes enlazar más de uno.
Resumen
Básicamente, no hay ninguna relación significativa entre delegate
y promise
, pero ambos son características útiles en jQuery moderno.