2013-08-25 13 views
8

Próbuję załadować kilka danych z interfejsu API Async i po załadowaniu wszystkich danych chcę wywołać zdarzenie, że wszystkie dane są ładowane. Problem w tym, że interfejs API, którego używam, ogranicza liczbę obiektów odpowiedzi do pięciu. I potencjalnie potrzebowałbym pobrać 30-40 obiektów odpowiedzi.Jak przechodzić między żądaniami Ajax wewnątrz JQuery Kiedy - to statystyka?

Co chcę zrobić, to utworzyć instrukcję when - then, która wykonuje pętle przez elementy danych i wysyła żądanie na każde pięć pozycji, a następnie po załadowaniu wszystkich elementów chcę uruchomić załadowane wydarzenie. Problem, który mam, polega na tym, że instrukcja "kiedy-to" kończy się przed sukcesem żądania ajax.

na kod, który próbowałem.

function loadsLotsOfStats(stats, dataType, eventName, dataName, callback) { 
    var groupedStats = []; 
    while (stats.length > 0) { 
     groupedStats.push(stats.splice(0, 5).join('/')); 
    } 
    j$.when(
     groupedStats.forEach(function (d) { 
      loadJSONToData(model.apiUrl.replace("{IDS}", d), "json", "", dataName, function (d) { /*console.log(d);*/ }, true) 
     }) 
    ).then(function() { 
     j$(eventSource).trigger('dataLoaded', eventName); 
    }); 

Funkcja loadJSONToData jest w zasadzie tylko funkcją wrapper dla asynchroniczny $ .ajax.

Tak więc zdarzenie jest wyzwalane przed załadowaniem danych. Również z jakiegoś powodu, jeśli spróbuję wstawić pętlę dokładnie w momencie (wypowiedzenia przez błąd składni?

Czy ktoś ma jakieś porady, w jaki sposób mogę zrobić kilka żądań Ajax i czekać, aż wszystkie zostaną compeleted przed aktywowaniem zdarzenia? Albo z dala, aby naprawić to, co obecnie mam?

z góry dziękuję za pomoc.

+0

Możesz także użyć 'if (condition.length <10) {// kod do wykonania}'. –

+0

Możliwy duplikat [próby wykonania 2 wywołań Ajax za pośrednictwem JQuery, a następnie przygotowanie danych (pobranych z projektu Freecodecamp Twitch)] (http://stackoverflow.com/questions/42425885/trying-to-make-2-ajax- call-via-jquery-a-then-prepending-the-data-from) –

Odpowiedz

16

jest możliwe, aby robić to, co ZAPISZ JEDNAK, serwer, na który wysyłasz swoje żądania prawdopodobnie ma już ok uzasadnienie limitu, który egzekwują. Jako ktoś, kto pracuje nad tworzeniem stron internetowych i widział z pierwszej ręki, jak denerwujący DDoS, skrobanie i inne nadużycia API mogą być, sugerowałbym dostosowanie się do ich ograniczeń.

To powiedziawszy, oto jak możesz to zrobić.

$ .ajax faktycznie zwraca obiekt odroczony, więc możesz go użyć na swoją korzyść. Również $ .może przyjmować dowolną liczbę odroczonych obiektów. Łączenie tych dwóch faktów może rozwiązać twój problem.

var deferreds = []; 
$.each(groupedStats, function(index, stat){ 
    deferreds.push(
     // No success handler - don't want to trigger the deferred object 
     $.ajax({ 
      url: '/some/url', 
      data: {stat: stat}, 
      type: 'POST' 
     }) 
    ); 
}); 
// Can't pass a literal array, so use apply. 
$.when.apply($, deferreds).then(function(){ 
    // Do your success stuff 
}).fail(function(){ 
    // Probably want to catch failure 
}).always(function(){ 
    // Or use always if you want to do the same thing 
    // whether the call succeeds or fails 
}); 

Pamiętaj, że nie jest to sytuacja wyścigowa. Chociaż $ .ajax jest asynchroniczne, $ .each nie jest, więc twoja lista odroczeń będzie całkowitą listą, zanim dojdziesz do $ .when i $ .then/$. Fail/$. Zawsze będzie wyzwalana tylko wtedy, gdy wszystkie skończą się .

EDYCJA: Zapomniałem dodać podział na 5, ale to ilustruje ogólny pomysł. Prawdopodobnie możesz dowiedzieć się, jak zastosować to do swojego problemu. Nawiasem mówiąc, możesz po prostu użyć array.splice (0,5), aby uzyskać 5 kolejnych wyników z tablicy. .splice jest bezpieczny w użyciu; jeśli całkowita liczba elementów jest mniejsza niż 5, to po prostu weźmie wszystkie pozostałe elementy.

+2

Kciuk w górę, działa dokładnie tak, jak tego potrzebuję. Świetna odpowiedź i dobre wyjaśnienie. Dzięki za poświęcony czas. I tak, zajrzę w inny sposób dostępu do potrzebnych mi danych, ponieważ twój prawo to jest z jakiegoś powodu. – recneps

+0

świetne wyjaśnienie! Działa jak marzenie. – Mike

+0

Przykro mi, jeśli go brakuje, ale jak złapać i ocenić odpowiedź – atwellpub

Powiązane problemy