¿Cómo funciona realmente el método de promesa de jquery?

Realmente no entiendo qué son los delegate y las promise .

De acuerdo con los documentos –

  • delegate vincularía un selector y evento a algún tipo de contenedor de envoltura que pueda usarse nuevamente en el futuro para artículos actuales y futuros.
  • promise() reasignaría las cosas a cuando se delimitó por primera vez si todo lo que se acaba de cargar coincide. Tal vez realmente no entiendo este método de promesa.

¿Qué pasa si el contenedor todavía está allí, pero el contenido del contenedor contenedor ha cambiado y / o vuelto a cargar a través de Ajax ? ¿Por qué los eventos no se desencadenan o funcionan como lo haría la primera vez que está vinculado?

Y sí, he estado en la página de documentos, simplemente no entiendo completamente sus explicaciones.

Estoy un poco confundido por esta pregunta. Creo que esto se debe a que estás confundido por la promise y delegate . De hecho, son características completamente independientes de jQuery. Explicaré cada uno por separado:

delegate

delegate es una característica de jQuery que se introdujo en jQuery 1.4.2. (Es un enfoque más agradable para la función en live que se agregó en jQuery 1.3). Resuelve un problema particular que viene con la modificación del DOM, y particularmente con llamadas AJAX.

Cuando vincula un controlador de eventos, lo vincula a una selección. Entonces puede hacer $('.special').click(fn) para vincular un controlador de eventos a todos los miembros de la clase special . Usted se une a esos elementos, por lo que si luego elimina la clase de uno de esos elementos, el evento seguirá activándose. Inversamente, si agrega la clase a un elemento (o agrega un nuevo elemento al DOM), no tendrá el evento enlazado.

Hay una característica de Javascript que mitiga este llamado “evento burbujeante”. Cuando se desencadena un evento, primero el navegador notifica al elemento donde se originó el evento. Luego sube el árbol DOM y notifica a cada elemento ancestro. Esto significa que puede vincular un manejador de eventos en un elemento en lo alto del árbol DOM, y los eventos activados en cualquier elemento secundario (incluso aquellos que no existen cuando el manejador estaba enlazado).

delegate es la implementación de jQuery de esto. Primero, selecciona un elemento principal. Luego especifica un selector: el controlador solo se ejecutará si el elemento de origen coincide con este selector. A continuación, especifique un tipo de evento, como click , submit , keydown , al igual que con el bind . Luego, finalmente, especifica el controlador de eventos.

 $('#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 jQuery. Es parte del concepto Deferred que se introdujo en jQuery 1.5. (Creo que la similitud en el sonido entre “diferido” y “delegado” es probablemente la fuente de confusión.) Esta es una manera de abstraer las complicaciones del código asincrónico. El mejor ejemplo de esto es con 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 }); 

Por lo tanto, es en muchos aspectos lo mismo que los controladores de éxito vinculantes en la llamada $.ajax , excepto que puede vincular más de un controlador, y puede vincularlos después de la llamada inicial.

Otro momento en el que sería útil tratar asincrónicamente es con animaciones. Puede proporcionar devoluciones de llamadas a las funciones, pero sería mejor hacerlo con una syntax similar al ejemplo AJAX que he proporcionado anteriormente.

En jQuery 1.6, esta funcionalidad fue posible y la promise es parte de esta implementación. Usted llama a promise en una selección de jQuery, y obtendrá un objeto al que puede enlazar controladores de eventos, cuando se hayan completado todas las animaciones en el objeto.

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 agrega flexibilidad. Puede enlazar a los controladores más adelante, y puede enlazar a más de uno.

Resumen

Básicamente, no hay una relación significativa entre delegate y promise , pero ambas son funciones útiles en jQuery moderno.