2012-06-09 25 views

Odpowiedz

48

W zależności od przypadku zastosowania, można również użyć jQuery.when [1]:

Jeśli pojedynczy argument przekazany do jQuery.when i to nie jest odroczona, to będą traktowane jako rozwiązany odroczony a wszystkie wykonane przydziały odsyłaczy z powrotem będą wykonane natychmiast.

Z jQuery.when można traktować tajemniczy obiekt zawsze jako odroczony:

// x could be a deferred object or an immediate result 
var x = getMysteriousObject(); 
// success will be called when x is a deferred object and has been resolved 
// or when x is an immediate result 
jQuery.when(x).then(success, error); 

[1] http://api.jquery.com/jQuery.when/

+0

Bardzo przydatna odpowiedź, dziękuję! – nrodic

+0

Czy Twój program obsługi sukcesu nie ma potencjalnie różnych argumentów przekazanych do niego - w zależności od tego, czy obiekt został odroczony czy nie? W takim przypadku nadal będziesz musiał używać pisania na klawiaturze, jak to sugerujesz poniżej. – backdesk

+1

@Crungmungus: "Jeśli pojedynczy argument zostanie przekazany do jQuery.Gdy i nie jest to Odroczona lub Obietnica, będzie traktowana jako rozstrzygnięta Odroczona, a wszystkie dołączone przydziały odsyłaczy zostaną wykonane natychmiastowo. " –

29

Ponieważ jQuery Odroczone są tworzone przez kopiowanie metod ukrytych obiektów zamiast wywoływania nowego operatora na funkcji, nie można udowodnić, że obiekt jest rzeczywiście instancją jQuery.Deferred. Myślę, że powinieneś pójść z Duck-Typing:

"Kiedy widzę ptaka, który chodzi jak kaczka i pływa jak kaczka, a szarpie jak kaczka, nazywam tego ptaka kaczką". - James Whitcomb Riley

W zależności od tego, co obiekty mogłyby zostać zwrócone (jakie właściwości należy się spodziewać), sprawdź czy występują szczególne właściwości/metody:

var x = getMysteriousObject(); 
if (x.promise) { 
    // Deferred 
} else { 
    // Not a deferred 
} 

Można szczegółowo tę kontrolę w razie potrzeby :

if ($.isFunction(x.promise)) { 
    // Deferred 
} 

lub (odróżnić odroczony cele i inne implementacje interfejsu firmy Promise)

if (x.promise && x.resolve) { 
    // Deferred 
} 
+0

OK, to myślę, że pisanie z kaczką to najlepsza droga. Martwiło mnie, że zamiast kaczki dostanie się przepiórka. Teraz myślę, że to nie jest takie ważne. Wielkie dzięki! – WawaBrother

1

Zainspirowany Niko's answer, stworzyłem kolejną realizację że sprawdzić, czy obiekt jest odroczone na podstawie nazwy jego właściwości: , ale także na temat zawartości tych właściwości. Musiałem to zrobić, ponieważ inny mój obiekt miał właściwość o nazwie obietnica.

if (typeof value.resolve !== "function") { 
    return false; 
} 
return String(value.resolve) === String($.Deferred().resolve); 
Powiązane problemy