Pozwól mi wyjaśnić trochę mój kod (Przepraszam, jeśli coś jest nie tak, właśnie napisałem ten przykład od zera, jest on bardzo zbliżony do tego, co obecnie mam).Wiele wywołań ajaxowych wewnątrz każdej funkcji(). Zrób coś, gdy WSZYSTKIE z nich zostanie zakończone?
HTML:
<form id="form">
<!-- Friend 1 -->
Name 1: <input type="text" name="friendName1" id="friendName1" class="friendName" value=""><br />
Email 1: <input type="text" name="friendEmail1" id="friendEmail1" value=""><br /><br />
<!-- Friend 2 -->
Name 2:<input type="text" name="friendName2" id="friendName2" class="friendName" value=""><br />
Email 2:<input type="text" name="friendEmail2" id="friendEmail2" value=""><br /><br />
<!-- Friend 3 -->
Name 3:<input type="text" name="friendName3" id="friendName3" class="friendName" value=""><br />
Email 3:<input type="text" name="friendEmail3" id="friendEmail3" value=""><br /><br />
<!-- Friend 4 -->
Name 4:<input type="text" name="friendName4" id="friendName4" class="friendName" value=""><br />
Email 4:<input type="text" name="friendEmail4" id="friendEmail4" value=""><br /><br />
<!-- Submit -->
<input name="submit" type="submit" value="Submit">
</form>
JS:
$("#form").submit(function(){
$(".friendName[value!='']").each(function(){
var idEmail = 'friendEmail' + $(this).attr("id").replace('friendName','');
if($("#"+idEmail+"[value!='']").length > 0){
var name = $(this).val();
var email = $("#"+idEmail).val();
// Submit the ajax request
$.ajax({
type: 'POST',
url: 'ajax/url',
data: {
name: name,
email: email
},
success: function(json) {
// Log a console entry if our ajax request was successful
console.log(name + " was submitted via ajax");
}
});
}
});
// Redirect the user to the thank you page
setTimeout(function() { window.location= '/thanks'; }, 2000);
});
JSFiddle (przekierowanie połączenia usunięty i zastąpiony ajax dzienniku konsoli na skrzypcach)
Kod HTML jest prostym formularzem z polami imienia i nazwiska oraz adresu e-mail znajomego.
JS ma każdą funkcję, która jeśli nazwa i powiązany adres e-mail mają wartości, uruchamia wywołanie ajax.
Potrzebuję sposobu na wywołanie tych wywołań ajaxowych (może istnieć 1 pętla, może być 15), a następnie po zakończeniu wszystkich, przekieruj do nowej strony.
Obecny sposób, w jaki to robię, jest okropny, ponieważ wszystkie wywołania ajaxowe nie kończą się przed przekierowaniem strony.
Co mogę zrobić, aby było lepiej? To musi być głupi dowód i TYLKO przekierowanie po zakończeniu wszystkich połączeń ajaxowych (sukces lub błąd, to nie ma znaczenia - wystarczy przekierować po zakończeniu).
Próbowałem użyć async: false
, ale nie wydaje się, aby coś zmienić.
Zastanawiałem się nad umieszczeniem licznika w każdej funkcji i liczniku w funkcji sukcesu ajax i jeśli oba pasują do siebie, następnie wykonaj przekierowanie, ale szukam bardziej doświadczonych wskazówek.
I zablokuje interfejs użytkownika. –
Po prostu zaktualizowałem moje pytanie, próbowałem użyć async: false, ale nie wydaje się, aby to miało znaczenie i nie chcę, aby przeglądarka zawiesiła się podczas wykonywania połączeń. – Latox
Ach ok ... pozwól mi trochę zagłębić. –