Sunt un pic confuz de această întrebare. Cred că acest lucru se datorează faptului că sunteți confuz prin promise și delegate. Acestea sunt, de fapt, caracteristici ale jQuery care nu au nicio legătură între ele. O să le explic pe fiecare în parte:

delegate

delegate este o caracteristică a jQuery care a fost introdusă în jQuery 1.4.2. (Este o abordare mai frumoasă a funcției live care a fost adăugată în jQuery 1.3). Rezolvă o anumită problemă care apare la modificarea DOM și, în special, la apelurile AJAX.

Când legați un gestionar de eveniment, îl legați de o selecție. Astfel, ați putea face $('.special').click(fn) pentru a lega un gestionar de eveniment la toți membrii clasei special. Vă legați de aceste elemente, astfel încât, dacă apoi eliminați clasa din unul dintre aceste elemente, evenimentul va fi în continuare declanșat. Invers, dacă adăugați clasa la un element (sau adăugați un nou element în DOM), acesta nu va avea evenimentul legat.

Există o caracteristică a Javascript care atenuează acest lucru, numită „event bubbling”. Atunci când un eveniment este declanșat, mai întâi browserul notifică elementul de unde a provenit evenimentul. Apoi, urcă în arborele DOM și notifică fiecare element strămoș. Acest lucru înseamnă că puteți lega un gestionar de eveniment pe un element aflat la o poziție înaltă în arborele DOM, iar evenimentele se declanșează pe orice element copil (chiar și pe cele care nu există atunci când gestionarul a fost legat).

delegate este implementarea jQuery a acestui lucru. Mai întâi, selectați un element părinte. Apoi, specificați un selector – handlerul va fi executat numai dacă elementul de origine se potrivește cu acest selector. Apoi specificați un tip de eveniment, cum ar fi click, submit, keydown, la fel ca în cazul bind. Apoi, în cele din urmă, specificați gestionarul evenimentului.

$('#containingElement').delegate('a.special', 'click', function() { alert('This will happen on all links with the special class');});

promise

promise este o altă adăugire relativ recentă la setul de caracteristici jQuery. Face parte din conceptul Deferred care a fost introdus în jQuery 1.5. (Cred că asemănarea de sunet dintre „deferred” și „delegate” este probabil sursa confuziei). Acesta este un mod de a face abstracție de complicațiile codului asincron. Cel mai bun exemplu în acest sens este în cazul apelurilor AJAX, deoarece obiectul returnat de $.ajax este un obiect Deferred. De exemplu:

$.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});

Așa că, în multe privințe, este la fel ca legarea gestionarilor de succes în apelul $.ajax, cu excepția faptului că puteți lega mai mulți gestionari și îi puteți lega după apelul inițial.

O altă situație în care ar fi utilă tratarea asincronă este cu animațiile. Puteți oferi callback-uri la funcții, dar ar fi mai frumos să faceți acest lucru cu o sintaxă similară cu exemplul AJAX pe care l-am oferit mai sus.

În jQuery 1.6, această funcționalitate a devenit posibilă, iar promise face parte din această implementare. Dacă apelați promise pe o selecție jQuery, veți obține un obiect la care puteți lega gestionari de evenimente, atunci când toate animațiile din obiect s-au finalizat.

De exemplu:

$('div.special').fadeIn(5000).promise().then(function() { // run when the animation succeeds}).then(function() { // also run when the animation succeeds});

Din nou, acest lucru este similar ca efect cu metodele tradiționale, dar adaugă flexibilitate. Puteți lega gestionarii mai târziu și puteți lega mai mult de unul.

Rezumat

În principiu, nu există o relație semnificativă între delegate și promise, dar ambele sunt caracteristici utile în jQuery modern.

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.