attend un callback jquery ajax de la fonction appelante

J’ai passé en revue beaucoup de réponses à ce type de question et maintenant je suis confus quant à la meilleure façon. Compte tenu de la dernière jQuery, je veux

  1. Appeler une fonction ajax
  2. faire un traitement ajax (succès ou erreur) // fonctionne bien
  3. en cas de succès ou d’erreur, renvoie le statut à la fonction appelante pour traitement ultérieur

dans la fonction appelante (doAjax), comment puis-je attendre un rappel puis terminer le traitement en cas de succès ou d’erreur (dans ce cas, en cas de succès, effacez un formulaire, si vous le maintenez tel quel)

Merci pour tout conseil,

Art [EDIT] Il y avait une faute de frappe comme vous l’avez remarqué, l’appel aurait dû être faitAnAjax pas DoAjax

$(function () { doAnAjax(Url, data, function (myRtn) { if (myRtn == "success") { resetForm($('#myForm')); resetForm($('form[name=addChlGrp]')); } else { $('.rtnMsg').html("Opps! Ajax Error"); } }); }); function doAnAjax(newUrl, data) { $.ajax({ url: newUrl, async: true, dataType: 'html', beforeSend: function () { $('.rtnMsg').html(""); }, type: "GET", data: data, cache: false, success: function (data, textStatus, xhr) { $('.rtnMsg').html(data); myRtnA = "Success" return myRtnA; }, error: function (xhr, textStatus, errorThrown) { $('.rtnMsg').html("opps: " + textStatus + " : " + errorThrown); myRtnA = "Error" return myRtnA; } }); } 

Vous devez utiliser une fonction de rappel. Essayez ceci ci-dessous:

 $(function() { // I think doAjax should doAnAjax() // here you're passing callback // but you're not using it doAnAjax() doAnAjax(Url, data, function(myRtn) { if (myRtnV == "success") { resetForm($('#myForm')); resetForm($('form[name=addChlGrp]')); } else { $('.rtnMsg').html("Opps! Ajax Error"); } }); }); // pass callback as third parameter to doAnAjax() function doAnAjax(newUrl, data, callBack) { $.ajax({ url: newUrl, async: true, dataType: 'html', beforeSend: function() { $('.rtnMsg').html(""); }, type: "GET", data: data, cache: false, success: function(data, textStatus, xhr) { $('.rtnMsg').html(data); myRtnA = "Success" return callBack( myRtnA ); // return callBack() with myRtna }, error: function(xhr, textStatus, errorThrown) { $('.rtnMsg').html("opps: " + textStatus + " : " + errorThrown); myRtnA = "Error" return callBack ( myRtnA ); // return callBack() with myRtna } }); 

Comme mentionné précédemment, en utilisant des rappels.

 function process(url, params, successCallback, errorCallback) { $.ajax({ success : successCallback, error : errorCallback, data : params, url : url, type : 'POST', dataType : 'json' }); } process( 'http://www.google.co.uk', { param1 : 'a' }, function(resp) { alert('Success'); }, function() { alert('Uh oh'); } ); 

Vous pouvez ensuite passer n’importe quelle fonction à process et elle sera appelée en cas de succès / d’erreur.

La réponse est que non, mais c’est facilement réalisable. L’idée d’AJAX est qu’elle est asynchrone, d’où A JAX. Cela signifie que la fonction qui appelle à l’origine votre ajax n’attendra pas qu’elle se termine et que tout le travail à terminer après un appel ajax devrait figurer dans les gestionnaires de succès ou d’erreur.

Si vous souhaitez que quelque chose soit synchrone, vous pouvez remplacer l’indicateur async:true par async:false mais il devient alors vraiment un appel SJAX (même si le terme existe, mais techniquement, il ne s’agit plus d’un appel AJAX).

Découvrez ‘derferred’ dans jQuery. L’exemple ci-dessous utilise deferred.done avec async désactivé et semble fonctionner pour moi.!

 $.ajax({ url: "http://www.whatever.com/whatever", async: false }).done(function( data ) { alert(data); //or whatever })