Tato otázka mě trochu mate. Domnívám se, že je to proto, že jste zmaten promise
a delegate
. Ve skutečnosti se jedná o zcela nesouvisející funkce jQuery. Vysvětlím každou zvlášť:
delegát
delegate
je funkce jQuery, která byla zavedena ve verzi jQuery 1.4.2. Je to funkce, která je součástí jQuery. (Jedná se o příjemnější přístup k funkci live
, která byla přidána v jQuery 1.3). Řeší určitý problém, který nastává při úpravě DOM a zejména při volání AJAXu.
Když provážete obsluhu události, provážete ji s výběrem. Takže byste mohli udělat $('.special').click(fn)
vazbu obsluhy události na všechny členy třídy special
. Vážeš se k těmto prvkům, takže pokud pak třídu z jednoho z těchto prvků odstraníš, událost bude stále spuštěna. A naopak, pokud třídu přidáte k nějakému prvku (nebo přidáte nový prvek do DOM), nebude mít navázanou událost.
Existuje vlastnost Javascriptu, která toto zmírňuje a nazývá se „bublinkování událostí“. Při spuštění události prohlížeč nejprve upozorní prvek, ve kterém událost vznikla. Poté postupuje vzhůru stromem DOM a oznamuje každý předcházející prvek. To znamená, že můžete navázat obsluhu události na prvek vysoko ve stromu DOM a události se spustí na všech podřízených prvcích (dokonce i na těch, které v okamžiku navázání obsluhy neexistují).
delegate
je implementace této funkce v jQuery. Nejprve vyberete nadřazený prvek. Poté zadáte selektor – obslužná rutina se spustí pouze v případě, že původní prvek odpovídá tomuto selektoru. Pak zadáte typ události, například click
, submit
, keydown
, stejně jako u bind
. Pak konečně určíte obsluhu události.
$('#containingElement').delegate('a.special', 'click', function() { alert('This will happen on all links with the special class');});
promise
promise
je dalším poměrně nedávným přírůstkem do sady funkcí jQuery. Je součástí konceptu Deferred
, který byl zaveden ve verzi 1.5 softwaru jQuery. (Myslím, že zdrojem záměny je pravděpodobně podobnost zvuku slov „deferred“ a „delegate“). Jedná se o způsob, jak abstrahovat od komplikací asynchronního kódu. Nejlepším příkladem je to u volání AJAX, protože objekt vrácený pomocí $.ajax
je objekt Deferred
. Například:
$.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});
Takže je to v mnoha ohledech stejné jako vázání obsluh úspěchu ve volání $.ajax
, až na to, že můžete vázat více než jednu obsluhu a můžete je vázat i po prvním volání.
Dalším případem, kdy by bylo užitečné řešit to asynchronně, jsou animace. Funkcím můžete poskytnout zpětná volání, ale bylo by příjemnější to udělat s podobnou syntaxí jako v příkladu AJAX, který jsem uvedl výše.
V jQuery 1.6 byla tato funkce umožněna a promise
je součástí této implementace. Zavoláte promise
na výběr jQuery a získáte objekt, na který můžete navázat obsluhy událostí, až se všechny animace v objektu dokončí.
Například:
$('div.special').fadeIn(5000).promise().then(function() { // run when the animation succeeds}).then(function() { // also run when the animation succeeds});
Znovu je to ve výsledku podobné tradičním metodám, ale přidává to flexibilitu. Obsluhy můžete svázat později a můžete jich svázat více než jednu.
Shrnutí
V podstatě mezi delegate
a promise
není žádný významný vztah, ale obě jsou užitečnými funkcemi v moderním jQuery.
.