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.

Deixe uma resposta

O seu endereço de email não será publicado.