2010-04-17 11 views
2

Ceci est probablement vraiment stupide mais je ne trouve pas le problème avec mon code. Il va chercher une url qui renvoie JSON et la fonction est alors censé retourner une chaîne:

function getit() { 
    var ws_url = 'example.com/test.js'; 
    var user = false; 

    $.getJSON(ws_url, function(data) { 
    alert('user '+data.user);//shows john 
    user = data.user || false; 
    }); 

    return user;//should return john but returns false 
} 

test.js aura quelque chose comme ceci:

{"id":"12","username":"ses","user":"john","error":""} 

ou comme ceci:

{"error":"123"} 

J'ai également essayé if (data.user) {} else {} mais cela n'a pas fonctionné non plus ..

Alors qu'est-ce que je manque?

Merci :)

Répondre

4

Le problème vient du fait que l'appel $.getJSON() est asynchrone. Une fois que la requête ajax est déclenchée, le traitement continue à getit() et votre fonction renvoie immédiatement la valeur false. Plus tard, la réponse Ajax renvoie et définit user, mais votre getit() fonctionne return ed il ya longtemps!

Vous pouvez forcer l'appel Ajax pour être synchrone avec l'option async, comme ceci:

$.ajax({ 
    async: false, 
    url: ws_url, 
    type: "GET", 
    success: function(data) { 
     alert('user '+data.user);//shows john 
     user = data.user || false; 
    } 
    }); 

Si vous le faites, votre navigateur bloque sur le script jusqu'à ce que le retour de l'appel Ajax. Généralement ce n'est pas le comportement idéal (ce qui explique pourquoi la valeur par défaut est async: true), donc je suggérerais de retravailler tout ce qui appelle getit(), et je m'attends à traiter ses résultats dès qu'il le peut, peut-être en passant sa propre fonction de rappel à getit() qui serait ensuite exécuté lorsque getit() est terminé.

2

Ajax est asynchrone, ce qui signifie que le reste du script ne va pas s'asseoir et attendre qu'elle se termine avant de passer. Comme dans votre exemple, la ligne return est atteinte avant que la fonction ajax ne reçoive une réponse du serveur, donc la variable utilisateur est toujours fausse à ce moment.

Si vous souhaitez forcer un appel ajax à s'exécuter de manière synchrone, vous pouvez utiliser la méthode jQuerys $.ajax et définir le paramètre async sur false.

$.ajax({ 
    url:ws_url, 
    dataType:"json", 
    async:false, 
    success:function(data){ 
    alert('user '+data.user);//shows john 
    user = data.user || false; 
    } 
}); 
Questions connexes