Jeg er lidt forvirret over dette spørgsmål. Jeg tror, det er fordi du er forvirret af promise
og delegate
. De er faktisk helt ubeslægtede funktioner i jQuery. Jeg vil forklare dem hver for sig:
delegate
delegate
er en funktion i jQuery, som blev indført i jQuery 1.4.2. (Det er en pænere tilgang til live
-funktionen, der blev tilføjet i jQuery 1.3). Den løser et særligt problem, der opstår ved ændring af DOM, og især ved AJAX-opkald.
Når du binder en hændelseshåndtering, binder du den til et valg. Så du kan gøre $('.special').click(fn)
for at binde en hændelseshåndtering til alle medlemmer af special
-klassen. Du binder til disse elementer, så hvis du derefter fjerner klassen fra et af disse elementer, vil hændelsen stadig blive udløst. Omvendt, hvis du tilføjer klassen til et element (eller tilføjer et nyt element i DOM), vil det ikke have begivenheden bundet.
Der er en funktion i Javascript, der afhjælper dette, kaldet “event bubbling”. Når en hændelse udløses, giver browseren først besked til det element, hvor hændelsen stammer fra. Derefter går den op i DOM-træet og giver besked til hvert forfædreleddet element. Det betyder, at du kan binde en hændelseshåndtering på et element højt oppe i DOM-træet, og at hændelser udløses på alle underordnede elementer (selv dem, der ikke eksisterer, når håndteringen blev bundet).
delegate
er jQuerys implementering af dette. Først vælger du et overordnet element. Derefter angiver du en selector – handleren vil kun blive kørt, hvis det oprindelige element passer til denne selector. Derefter angiver du en hændelsestype, f.eks. click
, submit
, keydown
, ligesom med bind
. Til sidst angiver du så hændelsesbehandleren.
$('#containingElement').delegate('a.special', 'click', function() { alert('This will happen on all links with the special class');});
promise
promise
er en anden relativt ny tilføjelse til jQuery-funktionerne. Det er en del af Deferred
-konceptet, der blev indført i jQuery 1.5. (Jeg tror, at ligheden i lyden mellem “deferred” og “delegate” sandsynligvis er kilden til forvirring). Det er en måde at abstrahere komplikationerne ved asynkron kode væk på. Det bedste eksempel på dette er med AJAX-opkald, da det objekt, der returneres af $.ajax
, er et Deferred
-objekt. For eksempel:
$.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});
Så det er på mange måder det samme som at binde succeshandlere i $.ajax
-opkaldet, bortset fra at du kan binde mere end én handler, og du kan binde dem efter det første opkald.
Et andet tidspunkt, hvor det ville være nyttigt at håndtere asynkront, er med animationer. Du kan give callbacks til funktioner, men det ville være pænere at gøre det med en syntaks, der svarer til det AJAX-eksempel, jeg har givet ovenfor.
I jQuery 1.6 blev denne funktionalitet muliggjort, og promise
er en del af denne implementering. Du kalder promise
på et jQuery-valg, og du får et objekt, som du kan binde begivenhedshåndtagere til, når alle animationer i objektet er afsluttet.
For eksempel:
$('div.special').fadeIn(5000).promise().then(function() { // run when the animation succeeds}).then(function() { // also run when the animation succeeds});
Også dette ligner i effekt de traditionelle metoder, men det tilføjer fleksibilitet. Du kan binde handlerne senere, og du kan binde flere end én.
Summary
Grundlæggende er der ikke nogen væsentlig sammenhæng mellem delegate
og promise
, men de er begge nyttige funktioner i moderne jQuery.