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);
Était-ce utile?

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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top