Olen hieman hämmentynyt tästä kysymyksestä. Luulen, että tämä johtuu siitä, että olet hämmentynyt promise
ja delegate
. Ne ovat itse asiassa jQueryn täysin toisistaan riippumattomia ominaisuuksia. Selitän kummankin erikseen:
delegate
delegate
on jQueryn ominaisuus, joka otettiin käyttöön jQuery 1.4.2:ssa. (Se on mukavampi lähestymistapa live
-ominaisuuteen, joka lisättiin jQuery 1.3:ssa). Se ratkaisee tietyn ongelman, joka liittyy DOM:n muokkaamiseen ja erityisesti AJAX-kutsuihin.
Kun sidot tapahtumankäsittelijän, sidot sen valintaan. Voit siis tehdä $('.special').click(fn)
sitoa tapahtumankäsittelijän kaikkiin special
-luokan jäseniin. Sitoudut näihin elementteihin, joten jos sitten poistat luokan yhdestä näistä elementeistä, tapahtuma käynnistyy silti. Päinvastoin, jos lisäät luokan johonkin elementtiin (tai lisäät uuden elementin DOM:iin), tapahtumaa ei sidota siihen.
Javaskriptissa on ominaisuus, joka lieventää tätä, nimeltään ”event bubbling”. Kun tapahtuma käynnistyy, selain ilmoittaa ensin sille elementille, josta tapahtuma on peräisin. Sitten se menee DOM-puussa ylöspäin ja ilmoittaa jokaiselle esi-elementille. Tämä tarkoittaa, että voit sitoa tapahtumankäsittelijän elementtiin, joka on korkealla DOM-puussa, ja tapahtumat laukeavat kaikkiin lapsielementteihin (jopa niihin, joita ei ollut olemassa, kun käsittelijä sidottiin).
delegate
on jQueryn toteutus tästä. Ensin valitaan vanhempi elementti. Sitten määrität valitsijan – käsittelijä suoritetaan vain, jos lähde-elementti vastaa tätä valitsijaa. Sitten määrität tapahtumatyypin, kuten click
, submit
, keydown
, aivan kuten bind
:ssä. Sitten lopuksi määritetään tapahtumankäsittelijä.
$('#containingElement').delegate('a.special', 'click', function() { alert('This will happen on all links with the special class');});
promise
promise
on toinen suhteellisen tuore lisäys jQueryn ominaisuuksiin. Se on osa Deferred
-käsitettä, joka otettiin käyttöön jQuery 1.5:ssä. (Luulen, että ”deferred”:n ja ”delegate:n” samankaltainen ääni on luultavasti sekaannuksen aiheuttaja). Tämä on tapa abstrahoida pois asynkronisen koodin komplikaatiot. Paras esimerkki tästä on AJAX-kutsuissa, sillä $.ajax
:n palauttama objekti on Deferred
-objekti. Esimerkiksi:
$.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});
Se on siis monella tapaa sama kuin onnistumisen käsittelijöiden sitominen $.ajax
-kutsussa, paitsi että voit sitoa useamman kuin yhden käsittelijän, ja voit sitoa ne alkuperäisen kutsun jälkeen.
Toinen kerta, jolloin asynkroninen käsittely olisi hyödyllistä, on animaatioiden kanssa. Voit antaa takaisinkutsuja funktioille, mutta olisi mukavampaa tehdä tämä samanlaisella syntaksilla kuin edellä antamassani AJAX-esimerkissä.
JQuery 1.6:ssa tämä toiminnallisuus tehtiin mahdolliseksi, ja promise
on osa tätä toteutusta. Kutsut promise
jQueryn valinnalle, ja saat objektin, johon voit sitoa tapahtumakäsittelijöitä, kun kaikki objektin animaatiot ovat päättyneet.
Esimerkiksi:
$('div.special').fadeIn(5000).promise().then(function() { // run when the animation succeeds}).then(function() { // also run when the animation succeeds});
Tämäkin on vaikutukseltaan samanlainen kuin perinteiset menetelmät, mutta se lisää joustavuutta. Voit sitoa käsittelijöitä myöhemmin, ja voit sitoa useamman kuin yhden.
Yhteenveto
Periaatteessa delegate
:n ja promise
:n välillä ei ole merkittävää suhdetta, mutta ne ovat molemmat hyödyllisiä ominaisuuksia nykyaikaisessa jQueryssä.