2011-01-30 6 views
1

J'ai une fonction javascript qui effectue un appel JSON à un service web en utilisant jQuery. Dans la fonction de réussite, je dois évaluer la réponse JSON et, si nécessaire, faire un autre appel à une méthode différente dans le même service Web.fonction appel ajax renvoie false

Voici comment je le fais:

function firstAjaxCall(aid, tid) { 
    $.ajax({ 
     type: "POST", 
     contentType: "application/json;charset=utf-8", 
     url: "/webservices/Webservice.asmx/Method1", 
     data: "{ auctionId: '" + aid + "'}", 
     dataType: "json", 
     success: function (response) { 
      var respData = response.d; 
      //do some stuff 
      if (respData.HasEnded == true) { 
       clearInterval(tid); 
       var end = false; 
       end = endFunction(aid); 
       if (end) { 
        // do some other stuff 
       } 
      } 
     }, 
     failure: function (errorMsg) { alert(errorMsg.toString()); } 
    }); 
} 

et la endFunction qui est appelé à partir de la fonction ajax succès:

function endFunction(aid) { 
    var hasEnded = false; 
    $.ajax({ 
     type: "POST", 
     contentType: "application/json;charset=utf-8", 
     url: "/webservices/Webservice.asmx/Method2", 
     data: "{ auctionId: '" + aid + "'}", 
     dataType: "json", 
     success: function (callbackData) { 
      var endRespData = callbackData.d; 
      hasEnded = endRespData.Success; 
      alert(hasEnded.toString()); 
     }, 
     failure: function(XMLHttpRequest, textStatus, errorThrown) { 
      console.log(textStatus, errorThrown); 
     } 
    }); 
    return hasEnded; 
} 

Voici les trucs bizarres. L'appel ajax est bien fait. Le code sur le serveur fonctionne selon le plan. Toutefois, si j'essaie de définir un point d'arrêt firebug dans la fonction de réussite de endFunction(aid), il n'est pas atteint, mais la boîte d'alerte s'affiche avec le mot vrai. C'est plutôt bon car il semble que nous atteignions la fonction de succès. La variable hasEnded n'est cependant jamais définie sur true, donc elle renvoie toujours false. L'appel endFunction(1) de la console Firebug affiche une zone d'alerte avec le mot true et renvoie la valeur false.

Qu'est-ce qui ne va pas?

Répondre

0

http://api.jquery.com/jQuery.ajax/ Il semble que vous utilisez "l'échec" dans la documentation que vous avez "erreur": erreur (XMLHttpRequest, textStatus, errorThrown) aussi vous devriez faire quelque chose comme ceci:

function firstAjaxCall(aid, tid) { 
    $.ajax({ 
     type: "POST", 
     contentType: "application/json;charset=utf-8", 
     url: "/webservices/Webservice.asmx/Method1", 
     data: "{ auctionId: '" + aid + "'}", 
     dataType: "json", 
     success: function (response) { 
      var respData = response.d; 
      //do some stuff 
      if (respData.HasEnded == true) { 
       clearInterval(tid); 
       var end = false; 
       endFunction(aid,function(endv){ 
        if (endv) { 
        // do some other stuff 
        } 
       }); 
      } 
     }, 
     error: function (errorMsg) { alert(errorMsg.toString()); } 
    }); 
} 

function endFunction(aid,endcallback) { 
    var hasEnded = false; 
    $.ajax({ 
     type: "POST", 
     contentType: "application/json;charset=utf-8", 
     url: "/webservices/Webservice.asmx/Method2", 
     data: "{ auctionId: '" + aid + "'}", 
     dataType: "json", 
     success: function (callbackData) { 
      var endRespData = callbackData.d; 
      hasEnded = endRespData.Success; 
      alert(hasEnded.toString()); 
      endcallback(hasEnded); 
     }, 
     error: function(XMLHttpRequest, textStatus, errorThrown) { 
      console.log(textStatus, errorThrown); 
      endcallback("?"); 
     } 
    }); 
    //return hasEnded; 
} 
+0

Merci pour les réponses! Essayé le code ci-dessus mais quand je cours firstAjaxCall je reçois "endcallback n'est pas une fonction". Je pense que j'ai besoin de plus de conseils sur cette chose de rappel ... –

+0

Ça devrait être quelque chose comme ça. Je devrais peut-être enlever le code et le décrire plus clairement. –

+0

Oui, ça devrait fonctionner de cette façon, mais d'une certaine manière ça ne fonctionne pas ... Je ne vous demande pas d'écrire le code pour moi, ce serait trop demander, mais un peu plus d'aide pour que le callback fonctionne être très utile et très apprécié. –

2

AJAX est asynchrone — l'appel $.ajax n'attendra pas une réponse du serveur.

Par conséquent, la ligne return hasEnded; s'exécute avant le rappel AJAX.

Vous devez faire votre endFunction prendre un paramètre de rappel, comme le fait $.ajax.