Estou um pouco confuso com esta pergunta. Eu acho que isto é porque você está confuso por promise
e delegate
. Eles são, na verdade, características completamente alheias a jQuery. Vou explicar cada uma separadamente:
delegate
delegate
é uma característica de jQuery que foi introduzida em jQuery 1.4.2. (É uma abordagem mais agradável à funcionalidade live
que foi adicionada em jQuery 1.3). Ele resolve um problema particular que vem com a modificação do DOM, e particularmente com chamadas AJAX.
Quando você vincula um manipulador de eventos, você o vincula a uma seleção. Então você pode fazer $('.special').click(fn)
para vincular um manipulador de eventos a todos os membros da classe special
. Você liga a esses elementos, então se você então remover a classe de um desses elementos, o evento ainda será acionado. Inversamente, se você adicionar a classe a um elemento (ou adicionar um novo elemento no DOM), ele não terá o evento vinculado.
Existe um recurso de Javascript que mitiga isso chamado “event bubbling”. Quando um evento é acionado, primeiro o navegador notifica o elemento de onde o evento se originou. Depois ele sobe na árvore DOM, e notifica cada elemento ancestral. Isto significa que você pode ligar um manipulador de eventos em um elemento no alto da árvore DOM, e eventos acionados em qualquer elemento criança (mesmo aqueles que não existem quando o manipulador foi ligado).
delegate
é a implementação de jQuery disto. Primeiro, você seleciona um elemento pai. Depois, você especifica um seletor – o manipulador só será executado se o elemento de origem corresponder a este seletor. Depois você especifica um tipo de evento, tal como click
, submit
, keydown
, tal como com bind
. Então finalmente você especifica o manipulador de eventos.
$('#containingElement').delegate('a.special', 'click', function() { alert('This will happen on all links with the special class');});
promise
promise
é outra adição relativamente recente ao conjunto de características jQuery. É parte do conceito Deferred
que foi introduzido no jQuery 1.5. (Eu acho que a semelhança no som entre “diferido” e “delegado” é provavelmente a fonte de confusão). Esta é uma forma de abstrair as complicações do código assíncrono. O melhor exemplo disto é com chamadas AJAX, pois o objeto retornado por $.ajax
é um objeto Deferred
. Por exemplo:
>
$.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});
Então é de muitas maneiras o mesmo que ligar os manipuladores de sucesso na chamada $.ajax
, exceto que você pode ligar mais de um manipulador, e você pode ligá-los após a chamada inicial.
Outra hora em que seria útil lidar assíncrono é com animações. Você pode fornecer callbacks para funções, mas seria melhor fazer isso com sintaxe similar à do exemplo AJAX que eu forneci acima.
Em jQuery 1.6, essa funcionalidade foi possível, e promise
é parte dessa implementação. Você chama promise
numa selecção jQuery, e obterá um objecto ao qual pode ligar os manipuladores de eventos, quando todas as animações no objecto tiverem terminado.
Por exemplo:
$('div.special').fadeIn(5000).promise().then(function() { // run when the animation succeeds}).then(function() { // also run when the animation succeeds});
Again, isto é similar aos métodos tradicionais, mas acrescenta flexibilidade. Você pode ligar os manipuladores mais tarde, e você pode ligar mais de um.
Resumo
Basicamente, não há relação significativa entre delegate
e promise
, mas ambos são recursos úteis no jQuery moderno.