2013-04-21 8 views
8

używam jQuery.Deferred i rejestracji done, fail i then teleskopowe:jQuery odroczony .then() nie jest wywoływana po .fail()

$.when(some_ajax(url)) 
    .done(function(result){}) 
    .fail(function(){}) 
    .then(function(){}); //just like that, with a single parameter 

Odkryłam, że kiedy mój ajax call succeeds, done i then wywołania zwrotne są wywoływane w tej kolejności. Jednak gdy ajax zawiedzie, wywołanie zwrotne fail jest wywoływane, ale nie dostaję się do wywołania zwrotnego then.

Przeczytałem dokumentację jQuery.Deferred, ale nie mogłem znaleźć wskazówki dotyczącej przyczyny tego zachowania.

Podczas korzystania always zamiast then, nazywa się to w obu przypadkach - sukces i porażka (pierwsza done/fail nazywa, następnie always nazywa). Dokumentacja nie wydaje się wskazywać na oczekiwaną różnicę między always i then w moim opisanym scenariuszu, dlaczego zachowują się inaczej?

+0

wezwanie do 'następnie()' zajmuje się tylko sukces, więc jest całkiem normalne, że nie poradzi sobie z przypadkiem niepowodzenia (myślę, że tak mówi Arun P Johny w swojej odpowiedzi). Czy masz na myśli, że przekazujesz również obsługę fail do 'then()' w twoim aktualnym kodzie? –

+0

@ FrédéricHamidi dziękuję, mam nadzieję, że moje pytanie jest teraz jasne (zredagowane) – Haji

+0

To jest rzeczywiście wyraźniejsze, a odpowiedź Arun jest słuszna: twoje wezwanie do 'then()' odnosi się tylko do sukcesu, a nie do niepowodzenia, więc logiczne jest, aby przewodnik nie w razie awarii. –

Odpowiedz

19

Składnia .then() jest .then(successCallback, failureCallbacl), dlatego w przypadku powodzenia są one wywoływane, aw przypadku niepowodzenia wywoływane jest tylko fail.

W twoim przypadku trzeba przejechać tylko jeden zwrotnego metody .then(), zostanie on zarejestrowany jako sukces zwrotnego, więc masz dwie sukcesu callbacków jeden zarejestrowany done() a drugi z .then(). Ale na razie błędu masz tylko jedno wywołanie zwrotne zarejestrowany .fail()

Jeśli chcesz zwrotna być nazywany niezależnie od sukcesu/porażki następnie użyć .always()

+5

@downvoters staram się wyjaśnić –

+1

Podejrzewam, że twoja odpowiedź jest właściwa (potrzebujemy więcej informacji od pytającego, aby się upewnić), ale może nie jest to wystarczająco jasne. Sugerowałbym, abyś spróbował wyjaśnić, co masz na myśli * w przypadku sukcesu, które są nazywane *, teraz można to rozumieć jako * zarówno sukces, jak i obsługa niepowodzeń są nazywane *, co jest błędne. (Na marginesie próbowałem zrównoważyć upadki, ale prawdopodobnie powinieneś usunąć swój poprzedni komentarz: jest zbędny, może być postrzegany jako obraźliwy i nie pomoże twojej sprawie). –

+0

@ FrédéricHamidi ok, zaktualizowałem swoją odpowiedź, czy to wystarczająco, –

Powiązane problemy