Duplicata possible:
Comment renvoyer la réponse d'un AJAX appel d'une fonction?
J'utilise Jquery Ajax pour appeler un service pour mettre à jour une valeur.
function ChangePurpose(Vid, PurId) {
var Success = false;
$.ajax({
type: "POST",
url: "CHService.asmx/SavePurpose",
dataType: "text",
data: JSON.stringify({ Vid: Vid, PurpId: PurId }),
contentType: "application/json; charset=utf-8",
success: function (data) {
Success = true;//doesnt goes here
},
error: function (textStatus, errorThrown) {
Success = false;//doesnt goes here
}
});
//done after here
return Success;
}
et service:
[WebMethod]
public string SavePurpose(int Vid, int PurpId)
{
try
{
CHData.UpdatePurpose(Vid, PurpId);
//List<IDName> abc = new List<IDName>();
//abc.Add(new IDName { Name=1, value="Success" });
return "Success";
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
le service est appelé avec succès depuis l'AJAX. La valeur est également modifiée. Mais après le service, succès: ou erreur: les fonctions ne sont pas appelées , dans ce cas le succès devrait avoir été appelé mais cela ne fonctionne pas.
J'ai utilisé Firebug et constaté que les fonctions de réussite ou d'erreur sont ignorées et vont directement à return Success;
Impossible de trouver quel est le problème avec le code.
Merci d'avance
Mise à jour: ajout de async: false
a résolu le problème
changez votre code en
function ChangePurpose(Vid, PurId) {
var Success = false;
$.ajax({
type: "POST",
url: "CHService.asmx/SavePurpose",
dataType: "text",
async:false,
data: JSON.stringify({ Vid: Vid, PurpId: PurId }),
contentType: "application/json; charset=utf-8",
success: function (data) {
Success = true;//doesnt goes here
},
error: function (textStatus, errorThrown) {
Success = false;//doesnt goes here
}
});
//done after here
return Success;
}
Vous ne pouvez renvoyer que les valeurs d'une fonction synchronous
. Sinon, vous devrez faire un callback
.
Je viens donc d'ajouter async:false,
à votre appel ajax
Mise à jour:
les appels jquery ajax sont asynchrones par défaut. Ainsi, les fonctions de réussite et d'erreur seront appelées lorsque le chargement ajax sera terminé. Mais votre déclaration de retour sera exécutée juste après le début de l'appel ajax.
ne meilleure approche sera
// callbackfn is the pointer to any function that needs to be called
function ChangePurpose(Vid, PurId, callbackfn) {
var Success = false;
$.ajax({
type: "POST",
url: "CHService.asmx/SavePurpose",
dataType: "text",
data: JSON.stringify({ Vid: Vid, PurpId: PurId }),
contentType: "application/json; charset=utf-8",
success: function (data) {
callbackfn(data)
},
error: function (textStatus, errorThrown) {
callbackfn("Error getting the data")
}
});
}
function Callback(data)
{
alert(data);
}
et appeler ajax comme
// Callback is the callback-function that needs to be called when asynchronous call is complete
ChangePurpose(Vid, PurId, Callback);
Essayez d'encapsuler l'appel ajax dans une fonction et définissez l'option async sur false. Notez que cette option est déconseillée depuis jQuery 1.8.
function foo() {
var myajax = $.ajax({
type: "POST",
url: "CHService.asmx/SavePurpose",
dataType: "text",
data: JSON.stringify({ Vid: Vid, PurpId: PurId }),
contentType: "application/json; charset=utf-8",
async: false, //add this
});
return myajax.responseText;
}
Vous pouvez également le faire:
$.ajax({
type: "POST",
url: "CHService.asmx/SavePurpose",
dataType: "text",
data: JSON.stringify({ Vid: Vid, PurpId: PurId }),
contentType: "application/json; charset=utf-8",
async: false, //add this
}).done(function ( data ) {
Success = true;
}).fail(function ( data ) {
Success = false;
});
Vous pouvez en savoir plus sur jqXHR jQuery Object