web-dev-qa-db-fra.com

comment faire une demande jquery "$ .post" synchrone

Cela fait longtemps que je recherche Google et que j'évite cette erreur dans ma liste de correctifs de bogues, mais j'ai enfin atteint la fin de la liste, la dernière pour laquelle je dois faire en sorte qu'une fonction renvoie true/false pour indiquer si la validation a réussi ou pas.

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

Je suis en train de définir une variable dans l'appel onSuccess et la méthode d'appel ne reçoit pas de réponse à cause de cela, donc tout mon js/jquery échoue sur pageLoad ... Je préférerais si je pouvais continuer à utiliser le $.post méthode.

161
pythonian29033

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, procédez comme suit:

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

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

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

Veuillez noter le async:false à la fin de l'objet de paramètre $.ajax().

Vous avez ici le détail complet des paramètres $.ajax(): jQuery.ajax () - Documentation de l'API jQuery .


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

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

  • utilisez un plugin, par exemple BlockUI ;
  • ajoutez manuellement une superposition avant d'appeler $.ajax(), puis supprimez-la lorsque le rappel AJAX .done() est appelé.

S'il vous plaît jeter un oeil à cette réponse pour un exemple.

203
Paolo Stefan

Si vous souhaitez une demande synchrone, définissez la propriété async sur false pour la demande. Découvrez le jQuery AJAX Doc

17
Jason McCreary

A partir de la documentation Jquery: vous spécifiez que l'option async est false pour obtenir une demande Ajax synchrone. Ensuite, votre rappel peut définir certaines données avant que votre fonction mère ne continue.

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.

6
pythonian29033