2012-01-19 7 views
7

Pracuję nad aplikacją internetową i muszę załadować kilka plików $ .ajax. Znalazłem coś interesującego w $ .when(). Then().Czy ktoś może wyjaśnić, w jaki sposób jQuery.when() i deferred.then() działa?

Działa świetnie, gdy nie mam nic szczególnego do roboty z danych zwróconych przez zapytanie jak w poniższym przykładzie:

$.when(
    $.getScript('js/script1.js'), 
    $.getScript('js/script2.js') 
).then(function(){ 
    // Do whatever I want once both scripts are loaded... 
}); 

Jeśli działa dobrze, gdy mam jeden wniosek ajax takiego:

$.when(
    $.ajax('xml/myxml.xml') 
).then(function(data){ 
    // Here I can work with data like I would with a regular ajax request 
    alert($(data).find('mynode').text()); 
}) 

Ale jeśli próbuję następujące, nie mogę zmusić go do pracy:

$.when(
    $.ajax('xml/myxml.xml'), 
    $.getScript('js/script.js') 
).then(function(data){ 
    // But here, I can't access $(data).find('mynode')... 
}) 

czytamStrona, ale większość z nich była zbyt techniczna dla mnie i nie jestem w stanie zrozumieć, w jaki sposób mam być w stanie uzyskać moje dane ajaxowe, gdy używam $ .when(). Then(), aby załadować skrypty i dane z wiele źródeł.

Więc jeśli ktoś może mi pomóc dowiedzieć się, jak korzystać z moich danych ajaxowych w moim przypadku testowym powyżej, byłoby świetnie! A jeśli w międzyczasie ktoś może wyjaśnić obiekt odroczonego obiektu w sposób łatwiejszy do zrozumienia niż oficjalna dokumentacja jQuery, byłoby świetnie!

Dziękujemy!

+0

Spróbuj sprawdzić argumenty zwrócone przez 'odroczony.następny" w tym przypadku. 'console.log (argumenty)' proszę publikować wyniki. –

+0

Spójrz na przykład na tej stronie: http://api.jquery.com/jQuery.when/ –

+0

Twoja metoda 'then' powinna przyjąć dwa argumenty:' .then (function (a1, a2) {'.... 'a1' będzie wynikiem pierwszego wywołania ajaxowego:' a2' będzie wynikiem wywołania getcript –

Odpowiedz

3

Podobno dla każdego odroczonego obiektu, przynajmniej jeśli jest to żądanie Ajax, $.when przekazuje do tego wywołania argument podobny do [ "success", statusText, jqXHR ]. jqXHR jest obiektem reprezentującym XMLHttpRequest (więcej informacji na ten temat w $.ajax documentation). Więc dodaje powinno działać:

$.when(
    $.ajax('xml/myxml.xml'), 
    $.getScript('js/script.js') 
).then(function(a){ 
    $(a[2].responseText).find('mynode'); 
}); 

Zobacz pierwszy przykład w dokumentacji $.when.

Odnośnie ogólnie odroczonych obiektów pomocny może być this question.

+0

Czy '.done()' działa tak samo, ponieważ prawdopodobnie już masz wersja demonstracyjna do przetestowania? Biorąc pod uwagę, że ponieważ nie stosuje się również wywołań zwrotnych fail, lepiej jest użyć '.done' zamiast' .then'? –

+0

@KevinB: Nie testowałem jeszcze tego szczerze. Zrobiłbyś to samo i masz rację, lepiej może dodać inne programy do obsługi sukcesu i obsługi błędów. Chociaż nie wiem, jak wygląda argument w przypadku awarii. Prawdopodobnie '[" error ", statusText, jqXHR]', ale nie wiem na pewno (i mam czas, aby przetestować go teraz). –

+0

Dzięki Felix, twoja odpowiedź postawiła mnie na właściwej drodze, ale indeks danych xml wynosi 0, nie 2 ... Si jeśli zrobię $ (dane [0]). Find ('mynode') to działa ... – Gabriel

Powiązane problemy