Ajax appel dans un each () boucle ne pas être asynchrone
-
19-09-2019 - |
Question
Ce que je suis en train de faire consiste à passer par une série de cases à cocher.
Pour chacun d'entre eux qu'il est vérifié, je dois effectuer des calculs (en utilisant un appel ajax). S'il y a une erreur, je dois briser la boucle et renvoyer un message.
Chaque appel ajax prend environ 0,4 secondes pour effectuer, mais qui ne sera jamais un problème parce que je ne peux pas avoir un maximum de 4 d'entre eux vérifiés à tout moment.
Mais le problème que je suis face est que, la zone d'alerte finale pops-up avant l'une à l'intérieur de la fonction d'erreur (). La fonction d'erreur fonctionne, mais il apparaît toujours après le dernier.
J'avais l'impression qu'en définissant l'appel comme asynchrone = false, l'exécution de code attendrait jusqu'à ce que l'appel a renvoyé une réponse. Est-ce une hypothèse erronée?
Est-il possible d'y arriver?
Merci d'avance
$("input[id*='chk_aut']").each(function() {
if(this.value=="on") {
$.ajax({
type: "GET",
url: "testpage.asp",
cache:"false",
async:"false",
data: "which=checkvalues&value="
+ i_value
+ "&ref="+$("#cb_ref").val()
+ "&nif="+$("#txt_nif").val()
+ "&day="+i_day
+ "&month="+i_month
+ "&hours="+i_hours
+ "&year="+i_year + "&ms="
+ new Date().getTime(),
success: function(msg) {
//do something but continue the loop
},
error: function() {
i_result =false;
alert("An error has occurred");
return false;//break the loop
}
});
}
});
alert(i_result);
La solution
Je pense que vous devez utiliser
,async: false
Alors que vous passez le booléen false , pas la chaîne "false" . Cela devrait rendre votre synchrone appel AJAX.
Voir cette question une situation similaire et quelques détails. En particulier, vous pouvez constater que pour les appels AJAX synchrone vous ne pouvez pas utiliser le gestionnaire de succès et doit retourner des résultats une fois que votre appel est terminé (vous êtes hors de la portée de l'AJAX appeler lui-même).
Si possible, vous devriez essayer de restructurer votre code afin qu'il puisse fonctionner de manière asynchrone. exécution synchrone ne se traduit pas bien au navigateur.
Dans votre situation, si vous utilisez chaque appel AJAX pour accumuler les résultats pour chaque case à cocher qui est cochée, pensez à stocker la valeur de travail dans une variable de fenêtre et de garder une trace des demandes sont de retour. Lorsque vous déterminez que vous avez reçu en retour une réponse positive pour chacun des AJAX appels effectués, vous pouvez lancer votre boîte d'alerte ou tout ce que vous voulez faire avec les résultats. C'est un exemple de la façon dont vous pouvez commencer à penser de manière asynchrone.
Autres conseils
Comme mentionné dans les manuel, la fonction error
est ...
Une fonction à appeler si la requête échoue.
Autrement dit, s'il y a un problème de communication entre le client et le serveur (par exemple: délai d'attente, aucune autorisation, etc.). Ce n'est pas appelé lorsque votre script côté serveur renvoie une valeur dans votre application est considérée comme une erreur. Déplacer ce code dans success
et vérifier les données de réponse pour voir comment traiter chaque demande votre script.
En outre, je dois mentionner que vous devez avoir vraiment de bonnes raisons d'utiliser les appels synchrones. Oui, dans votre test, il ne prend que 1,5 secondes, mais ce qui se passe quand quelqu'un a une connexion lente ou votre serveur est sous une charge lourde ou indisponible? Requêtes synchrones gèlent le navigateur du client (qui est, même pas des choses comme changer les onglets ou le défilement des œuvres) et de faire une très mauvaise expérience utilisateur. Si vous ne voulez bloquer l'interface utilisateur sur votre page, il y a beaucoup de façons de le faire plus amicaux. Par exemple, consultez BlockUI .
Il est préférable d'utiliser les callbacks et commencer à penser de manière asynchrone, plutôt que de la procédure. Il est un peu difficile quand vous commencez (depuis votre code est exécuté pas nécessairement dans l'ordre ligne par ligne), mais il est très puissant et flexible une fois que vous obtenez le coup de lui.
Utilisez async:false
au lieu de async:"false"
et apprécier.
Je ne suis pas familier avec l'option async dans l'appel ajax. J'utilise le gestionnaire Ajax jQuery avec succès pour les situations où j'ai besoin des appels synchrones ajax: http: // plugins.jquery.com/project/AjaxManager