2013-05-16 3 views
2

Voici mon JavaScript. Comment est-ce que je fais la variable success globale de sorte que les changements faits dans ajax-> succès soient reflétés dehors?Accéder à la variable globale javascript

function foo() { 
    var success = false; 
    $.ajax({ 

     type: "POST", 
     url: "", 
     dataType: "xml", 
     success: function(xml) { 
      var code = parseInt($(xml).find("Response").attr("code"), 10); 
      switch (code) { 
       case 1: 
        success = false; 
        break; 
       case 0: 
        success = true; 
        break; 
      } 
     } 
    }); 
    return success; 
} 
+1

Je crois que si vous le déclarez en dehors de toute fonction, c'est une variable globale. Ce sera quelque chose comme 'window.success' !!! – NINCOMPOOP

+0

Vous ne savez pas exactement ce que vous essayez d'atteindre mais la variable "succès" est placée correctement et devrait fonctionner. En outre, si vous renvoyez "succès", cela signifie que vous l'utilisez dans une fonction, en créant une variable privée pour cette fonction spécifique. Si vous voulez en faire une variable globale, mettez-la simplement au tout début de votre script, ou juste en dehors de cette fonction. –

+1

Ceci est littéralement la question la plus posée dans JavaScript SO. Tout est dans le nom: AJAX ou ** Asynchrone ** JavaScript et XML. – elclanrs

Répondre

4

passer une fonction de rappel qui est appelée dans le success:

function makeCall(callback) { 
    $.ajax({ 
     type: "POST", 
     url: "", 
     dataType: "xml", 
     success: function(xml) { 
      var code = parseInt($(xml).find("Response").attr("code"), 10); 
      callback(!code); 
     } 
    }); 
} 

makeCall(function (success) { 
    alert(success); 
}); 

Voici comment la programmation asynchrone/travail de demandes. Bien sûr, l'alternative est d'en faire une demande synchrone, mais en quelque sorte, elle va à l'encontre du but.

J'ai condensé les choses switch parce que vous sembliez vouloir les valeurs booléennes opposées de 0 et 1.

0

L'approche que vous êtes après ne fonctionnera pas. L'appel Ajax est asynchrone. Ce qui signifie qu'il reviendra immédiatement avant même que le GET réel est déclenché. Ainsi, le var externe (qui est accessible depuis l'intérieur du rappel de succès, grâce aux fermetures) n'aura pas de valeur autre que celle établie avant l'appel Ajax au moment où il est retourné. Au lieu de cela, vous pouvez spécifier que l'appel Ajax se déclenche de manière synchrone, en définissant async: false avec les autres valeurs du $ .ajax, ou vous pouvez restructurer le code pour faire ce que vous voulez faire si la fonction retourne true rappel de succès.

+0

Je pensais vous upvoter jusqu'à ce que je vous aie recommandé 'async: false' –

+0

' async: false' est 'ajax' car' eval' est 'chaine'? – elclanrs

+0

@elclanrs no. 'eval' ne fait qu'inviter des attaques par injection et est lent comme l'enfer. 'async: false' est un mal pur ;-) –

Questions connexes