162 votes

Comment rendre synchrone une requête jquery "$.post" ?

Cela fait longtemps que je cherche sur Google et que j'évite cette erreur dans ma liste de corrections de bogues, mais j'ai finalement atteint la fin de la liste, la dernière étant de faire en sorte qu'une fonction renvoie true/false pour indiquer si la validation a réussi ou non.

J'utilise ajax pour comparer certains champs avec ceux qui sont déjà dans la base de données et par défaut la fonction $.post() effectue ses opérations de manière asynchrone.

Je définis une variable à l'intérieur de l'appel onSuccess et la méthode d'appel ne reçoit pas de réponse à cause de cela, donc tous mes js/jquery échouent au pageLoad... Je préférerais pouvoir continuer à utiliser la méthode $.post méthode.

205voto

Paolo Stefan Points 3352

jQuery < 1.8

Puis-je vous suggérer d'utiliser $.ajax() au lieu de $.post() car il est beaucoup plus personnalisable.

Si vous appelez $.post() , par exemple, comme ceci :

$.post( url, data, success, dataType );

Vous pouvez le transformer en son $.ajax() équivalent :

$.ajax({
  type: 'POST',
  url: url,
  data: data,
  success: success,
  dataType: dataType,
  async:false
});

Veuillez noter que les async:false à la fin de la $.ajax() objet de paramètre.

Vous trouverez ici un détail complet de la $.ajax() paramètres : jQuery.ajax() - Documentation API jQuery .


jQuery >=1.8 "async:false" avis de dépréciation

jQuery >=1.8 ne bloque pas l'interface utilisateur pendant la requête http, nous devons donc utiliser une solution de contournement pour arrêter l'interaction avec l'utilisateur tant que la requête est traitée. Par exemple :

  • utiliser un plugin, par exemple BlockUI ;
  • ajouter manuellement un recouvrement avant d'appeler $.ajax() puis la supprimer lorsque l'application AJAX .done() est appelé.

Veuillez consulter cette réponse à titre d'exemple.

17voto

Jason McCreary Points 35919

Si vous souhaitez une demande synchrone, définissez l'option async à la propriété false pour la demande. Consultez le site web de l jQuery AJAX Doc

6voto

pythonian29033 Points 1595

D'après la documentation de Jquery, il faut spécifier que l'option async est fausse pour obtenir une requête Ajax synchrone. Ensuite, votre callback peut définir certaines données avant que votre fonction mère ne procède.

Voici à quoi ressemblerait votre code s'il était modifié comme suggéré :

beforecreate: function(node,targetNode,type,to) {
    jQuery.ajax({
         url:    url,
         success: function(result) {
                      if(result.isOk == false)
                          alert(result.message);
                  },
         async:   false
    });          
}

c'est parce que $.ajax est le seul type de requête pour lequel vous pouvez définir l'asynchronisme

1voto

Femi Points 42054

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X