2013-05-16 6 views
0

Pourquoi x n'est-il pas défini à la ligne 11 lorsqu'il est défini à la ligne 9?JavaScript, Ajax, Json: comment utiliser une variable dont la valeur dépend de la réponse json?

<script> 
    var x; 
    $.ajax({ 
    dataType: "json", 
    url: myurl, 
    success: function(data){ 
     console.log(data); 
     x = data; 
     document.write(x); 
    } 
    }); 
    document.write(x); 
</script> 
+1

Scope n'a rien à voir avec ajax ou json. – Bergi

+0

duplicata possible de [Comment retourner le texte de réponse AJAX?] (Http://stackoverflow.com/questions/1225667/how-to-return-ajax-response-text) – Quentin

+2

Doit être fermé ... il y a déjà des tonnes de questions à ce sujet. – plalx

Répondre

1

C'est parce que line 11 est exécuté avant le succès de la fonction de rappel Ajax (Asynchronous) exécute et réglez la valeur à line 8.

Vous pouvez le faire à la place.

function MakeAjaxCall(callback) 
{ 
    $.ajax({ 
    dataType: "json", 
    url: myurl, 
    success: function(data){ 
     console.log(data); 
     callback(data); 

    } 
    }); 
} 
function wantToCallAjaxAndUseResult() 
{ 

    MakeAjaxCall(function(x){console.log(x)}); 
} 
1

Cela a plus à voir avec AJAX étant asynchrone, plutôt que de la portée variable. Le contrôle passe immédiatement à la ligne 11x n'est pas défini. Cependant, la ligne 8 sera exécutée à un certain point indéterminé dans le futur (c'est-à-dire, après que la requête est terminée et le rappel est appelé et exécuté), après que la ligne 11 a été exécutée.

+3

non seulement "* très probablement *", mais "* certainement *" :-) – Bergi

+0

@Bergi C'est vrai :) –

5

Parce que vous avez un comportement asynchrone ici. Le flux de votre programme est en fait comme ceci:

1- Vous déclarez x

2- Vous faites une demande ajax

3- Vous écrivez x dans le document (à ce point, x a pas de valeur)

4- La requête ajax reçoit une réponse et vous définissez la valeur de x à cette réponse et l'écrivez sur le document.

Votre problème n'est pas une question de portée, c'est une question de timing.

0

Ajax s'exécute de manière asynchrone. JavaScript effectue une requête et continue d'exécuter un autre code en attendant la fin de la requête. Cela signifie que vous ne pouvez pas compter sur lorsque la demande se terminera ou même si il se terminera. Ainsi tout travail qui dépend du résultat d'un appel ajax doit être fait dans le rappel ajax. Vous ne pouvez tout simplement pas compter sur tout ce qui se passe à l'intérieur du rappel ajax ayant un effet sur quoi que ce soit en dehors du rappel à tout moment.