Jag är lite förvirrad över den här frågan. Jag tror att det beror på att du är förvirrad av promise och delegate. De är i själva verket helt orelaterade funktioner i jQuery. Jag ska förklara dem var för sig:

delegate

delegate är en funktion i jQuery som infördes i jQuery 1.4.2. (Det är ett trevligare tillvägagångssätt för live-funktionen som lades till i jQuery 1.3). Den löser ett särskilt problem som kommer med modifiering av DOM, och särskilt med AJAX-anrop.

När du binder en händelsehanterare binder du den till ett urval. Så du kan göra $('.special').click(fn) för att binda en händelsehanterare till alla medlemmar i klassen special. Du binder till dessa element, så om du sedan tar bort klassen från ett av dessa element kommer händelsen fortfarande att utlösas. Omvänt, om du lägger till klassen till ett element (eller lägger till ett nytt element i DOM) kommer det inte att ha händelsen bunden.

Det finns en funktion i Javascript som mildrar detta och som kallas ”event bubbling”. När en händelse utlöses meddelar webbläsaren först det element där händelsen uppstod. Sedan går den uppåt i DOM-trädet och meddelar varje anhörigelement. Detta innebär att du kan binda en händelsehanterare på ett element högt upp i DOM-trädet, och händelserna utlöses på alla underordnade element (även de som inte existerar när hanteraren binds).

delegate är jQuerys implementering av detta. Först väljer du ett överordnat element. Sedan anger du en selektor – handläggaren kommer endast att köras om det ursprungliga elementet matchar denna selektor. Sedan anger du en händelsetyp, till exempel click, submit, keydown, precis som med bind. Sedan specificerar du slutligen händelsehanteraren.

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

promise

promise är ett annat relativt nytt tillägg till jQuery-funktionerna. Det är en del av Deferred-konceptet som introducerades i jQuery 1.5. (Jag tror att likheten i ljudet mellan ”deferred” och ”delegate” förmodligen är källan till förvirring.) Detta är ett sätt att abstrahera bort komplikationerna med asynkron kod. Det bästa exemplet på detta är med AJAX-anrop, eftersom det objekt som returneras av $.ajax är ett Deferred-objekt. Till exempel:

$.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 är på många sätt samma sak som att binda framgångshandläggare i $.ajax-anropet, förutom att du kan binda mer än en handläggare och att du kan binda dem efter det första anropet.

Ett annat tillfälle då det skulle vara användbart att hantera asynkront är med animationer. Du kan tillhandahålla callbacks till funktioner, men det skulle vara trevligare att göra detta med liknande syntax som i AJAX-exemplet jag gav ovan.

I jQuery 1.6 möjliggjordes den här funktionaliteten, och promise är en del av den här implementeringen. Du anropar promise på ett jQuery-urval, och du får ett objekt som du kan binda händelsehanterare till, när alla animationer i objektet har avslutats.

Till exempel:

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

Även detta har samma effekt som de traditionella metoderna, men det tillför flexibilitet. Du kan binda handläggarna senare, och du kan binda fler än en.

Sammanfattning

I grund och botten finns det inget signifikant samband mellan delegate och promise, men de är båda användbara funktioner i modern jQuery.

Lämna ett svar

Din e-postadress kommer inte publiceras.