2010-09-14 7 views
1

comment est-ce que je peux rendre les résultats d'écrasement de données variables?js variable scope question

var ajax = { 
    get : { 
     venues : function(search){ 
      var results = "@"; 
      $.getJSON("http://x.com/some.php?term="+search+"&callback=?",function(data){ results = data; }); 
      return results; 
     } 
    } 
}; 
+2

Pas un problème d'étendue. Vous devez comprendre le fonctionnement du code asynchrone et des callbacks. Voir par exemple. http://stackoverflow.com/questions/2021114/javascript-jquery-variables-not-giving-expected-values, http://stackoverflow.com/questions/1092563/scope-of-variable-in-javascript-problem pour d'autres qui sont tombés dans le même piège. – bobince

Répondre

6

dataestresults écraser, juste après results a été retourné.

Vous pouvez utiliser la fonction ajax au lieu de getJSON, puisque getJSON est juste un raccourci pour

$.ajax({ 
    url: url, 
    dataType: 'json', 
    data: data, 
    success: callback 
}); 

et a également mis en async-false, de sorte que l'appel bloque.

Cependant, dans votre cas cela ne fonctionnera pas, car les requêtes JSONP (avec "?callback=?") ne peuvent pas être synchrones.

L'autre option (mieux) est que le code dépendant de la valeur de retour results soit appelé par le rappel success.

Ainsi, au lieu de quelque chose comme ceci:

var results = ajax.get.venues('search'); 
$('#results').html(translateResults(results)); 

Peut-être quelque chose comme ceci:

ajax.get.venues('search', function (results) { 
    $('#results').html(translateResults(results)); 
}); 

venues = function (search, callback) { 
    $.getJSON("http://x.com/some.php?term="+search+"&callback=?", 
       function(data){ 
        callback(data); 
       }); 
}; 
5

Votre problème est la nature asynchrone de JavaScript. resultsEst-ce que est écrasé, mais seulement plus tard, après que la fonction a déjà quitté, parce que le rappel est exécuté lorsque la requête est terminée.

vous devez faire la synchronisation d'appel Ajax en utilisant sync: true (ce qui est généralement pas une bonne idée, juste mentionner à cause de l'exhaustivité) ou restructurer votre flux de code de sorte qu'il ne dépend pas de la valeur return plus, mais tout ce que vous devez faire se fait dans la fonction de rappel.

3

Ceci n'est pas un problème d'étendue. C'est parce que $.getJSON est asynchrone; results est renvoyé avant que $.getJSON se termine. Essayez de faire un rappel pour $.getJSON pour appeler quand c'est fait.

function JSON_handler(data){ 
    // do stuff... 
} 

$.getJSON("http://x.com/some.php?term="+search+"&callback=?", JSON_handler); 
3

Vous pouvez mettre la logique que vous souhaitez exécuter dans un rappel.

var ajax = { 
     get : { 
     venues : function(search, fnCallback){ 
      var results = "@"; 
      $.getJSON("http://x.com/some.php?term="+search+"&callback=?", 
       function(data){ 
        // success 
        results = data; 
        (typeof fnCallback == 'function') && fnCallback(data); 
       }); 
      return results; 
     } 
    } 
}; 

ajax.get.venues(term, function(result){ 
    // Do stuff with data here :) 
}) 

la programmation fonctionnelle peut être amusante.