Comment obtenir la valeur de retour dans une fonction avec un appel Ajax interne – JQuery

Cela peut sembler très facile à quelques-uns de vous, mais je ne peux pas comprendre pourquoi je ne peux pas obtenir la valeur de retour, même après avoir sélectionné de nombreux messages 🙁

function getMessageCount() { var count; $.ajax({ type: "POST", url: "http://localhost:43390" + "/services/DiscussionWidgetService.asmx/GetMessageCount", dataType: "json", contentType: "application/json; charset=utf-8", success: function (data) { count = data.d; } //success }); return count; } 

Maintenant, si j'appelle var count = getMessageCount() ; Il me donne undefined 🙁 alors que le nombre de méthodes est correct, c'est-à-dire que le service fonctionne bien.

C'est parce que l' $.ajax() est asynchrone.

Si vous modifiez votre code sur quelque chose comme:

 function getMessageCount(callback) { var count; $.ajax({ type: "POST", url: "http://localhost:43390" + "/services/DiscussionWidgetService.asmx/GetMessageCount", dataType: "json", contentType: "application/json; charset=utf-8", success: function (data) { count = data.d; if(typeof callback === "function") callback(count); } //success }); } 

Ensuite, lorsque vous l'appelez:

 getMessageCount(function(count){ console.log(count); }); 

Je suis d'accord avec la première ligne par ahren que 'C'est parce que l'appel $ .ajax () est asynchrone.'

Vous pouvez essayer d'ajouter un paramètre – async: false qui est vrai par défaut. Cela rend l'appel synchrone.

Vous pouvez modifier votre code comme suit:

 function getMessageCount() { var count; $.ajax({ type: "POST", url: "http://localhost:43390" + "/services/DiscussionWidgetService.asmx/GetMessageCount", dataType: "json", async:false, contentType: "application/json; charset=utf-8", success: function (data) { count = data.d; } //success }); return count; } 

Utiliser un rappel:

Fonction d'appel comme:

 getMessageCount(function(result) { //result is what you put in the callback. Count in your case }); 

Et l'autre comme:

 function getMessageCount(callback) { var count; $.ajax({ type: "POST", url: "http://localhost:43390" + "/services/DiscussionWidgetService.asmx/GetMessageCount", dataType: "json", contentType: "application/json; charset=utf-8", success: function (data) { count = data.d; if (callback) { callback(count); } } //success }); } 

Pourquoi ne pas simplement passer à une fonction?

 function getMessageCount() { var count; $.ajax({ type: "POST", url: "http://localhost:43390" + "/services/DiscussionWidgetService.asmx/GetMessageCount", dataType: "json", contentType: "application/json; charset=utf-8", success: function (data) { count = data.d; countMessages(count); } //success }); } function countMessages(counted) {var counted = counted; console.log(counted);} 
 function ajax_call(url,data){ return $.ajax({ type: "POST", url: url, data: data, async:false, success: function(status){ } }).responseText; } 

Maintenant, vous recevrez le texte de réponse du côté du serveur via un appel ajax