2016-08-03 9 views
6

Mam tablicę wartości (myarray), którą chcę iterować i uruchomić żądanie AJAX dla każdej iteracji. Mam umieścić każdy ajax żądania wewnątrz innej tablicy (requests), tak, że mogę nazwać alert gdy wszystkie żądania AJAX ukończyli:Zbierz wyniki AJAX w kolejności

tak:

var requests = []; 
for (i = 0; i < myarray.length; ++i) { 
    requests.push($.ajax({ 
     url: 'anotherurl?=' + myarray[i], 
     dataType: "JSONP", 
     success: function (data) { 
      array_of_results.push(data); 
     } 
    })); 
} 
$.when.apply($, requests).done(function() { 
    alert('complete'); 
}); 

Wszystkie wyniki są zebrane w array_of_results. Jednak z powodu żądań AJAX, które trwają w różnym czasie, tablica ta nie ma wyników w pierwotnej kolejności.

Czy istnieje sposób na zamówienie tej tablicy?

Mam nadzieję, że mam sens. Doceniam to, że jest dość zawiłe.

+1

wywołanie ajax w pętli for. Czy to konieczne ? –

+0

Najlepiej wykonywać tę pracę, wykorzystując obietnice. Takich jak odwzorowanie tablicy w tablicy obietnic (powiedz 'myPromiseArray'), a następnie wywołanie' Promise.all (myPromiseArray) .then (onFulFillment, onReject) 'Gdzie wywołania zwrotne' onFulfillment' i 'onReject 'zostaną dostarczone z tablicą wyniki wywodzące się z obietnic w pierwotnej kolejności. – Redu

+0

Asi rozumie, że wywołanie $ .ajax() zwraca obiekt jqXHR, który od V1.5 przechowuje wszystkie właściwości, metody i zachowanie interfejsu Promise. Więc realizacja tego, o czym wspomniałem w powyższym komentarzu, powinna być błogością. Aby uzyskać więcej informacji na temat tego http://api.jquery.com/jquery.ajax/#jqXHR – Redu

Odpowiedz

7

Czy próbowałeś następujące elementy? Myślę, że to powinno zadziałać. Wszystkie odpowiedzi powinny być dostępne, w kolejności, w funkcji sukcesu when().

var requests = []; 
for (i = 0; i < myarray.length; ++i) { 
    requests.push($.ajax({ 
     url: 'anotherurl?=' + myarray[i], 
     dataType: "JSONP" 
    })); 
} 
$.when.apply($, requests).done(function() { 
    array_of_results = arguments; 
    alert('complete'); 
}); 
+0

, pominięto przesuwanie danych do array_of_results, gdy sukces (każdego wywołania ajaxowego) –

+0

poprawiłem mój przykład. Aby uzyskać parametry funkcji sukcesu w postaci tablicy, należy użyć specjalnego słowa kluczowego JS "argumenty". –

+0

Ok .. ale kolejność będzie jeszcze zwrócona wywołanie ajax, a nie wywołanie –

0

Zamiast używać pętli, należy rozważyć zastosowanie rekursji. Oto pełny przykład:

var myArray = [ 
    "somevalue", 
    "some other value", 
    "another value" 
]; 
var i = myArray.length; 
var responses = []; 

function doRequests(){ 
    i--; 
    $.ajax({ 
     url: "myurl.php", 
     data: {paramname: myArray[i]} 
    }).done(function(response){ 
     responses.push(response); 
     if(i>0) doRequests(); 
     else{ 
      // all requests sent.. do stuff 
      // responses array is in order 
      console.log(responses); 
      alert("all done!"); 
     } 
    }); 
} 
-1

Jak korzystać z wywołania jquery.ajax z ustawieniem asynchronicznym jako false. W ten sposób reaponse będzie w porządku, jak o ...

+0

Powoduje zawieszenie przeglądarek i zatrzymuje inny proces :) –

+0

również jestem pewien, że jest przestarzały. Czuję, że widziałem komunikat na konsoli, że ostatni raz próbowałam sjaxa .. –

-1

Opierając się na @ odpowiedź Christo - wykorzystanie tablic mapa funkcję

var array_of_results = []; 
var requests = myarray.map(function(item, index) { 
    return $.ajax({ 
     url: 'anotherurl?=' + item, 
     dataType: "JSONP", 
     success: function (data) { 
      array_of_results[index] = data; 
     } 
    } 
}); 

...

+0

dlaczego upadł?to jest doskonale dobry kod, tylko dlatego, że Christo skasował swoją odpowiedź, nie czyni to tej odpowiedzi mniej ważną - anonimowe tchórznięcia bez komentarza –

1

Możesz dodać niestandardowy atrybut do Twojego $.ajax obiekt, ustawiony na Twój i var.

var requests = []; 
for (i = 0; i < myarray.length; ++i) { 
    requests.push($.ajax({ 
     url: 'anotherurl?=' + myarray[i], 
     dataType: "JSONP", 
     myCustomIndex: i, 
     success: function (data) { 
      array_of_results[this.myCustomIndex] = data; 
     } 
    })); 
} 
$.when.apply($, requests).done(function() { 
    alert('complete'); 
}); 

JavaScript jest naprawdę permisive, jeśli przypisać wartość do tablicy poza jej granicami (wyższa niż 0), rozmiar tablicy zostanie automatycznie ustawiony w odpowiedniej ilości.

+0

Myślę, że wartość "i" jest zawsze ostatnią wartością cyklu "za" (patrz zamknięcie ...) –

+1

Ho tak! Masz rację, teraz edytuję ten bałagan! –