2010-12-09 39 views
0

J'ai fait un appel d'API avec l'aide de $.getJSON mais je ne sais pas comment rendre les données retournées disponibles globalement pour être également utilisées dans d'autres fonctions.Comment rendre jQuery JSON retourné les données disponibles globalement et l'aide de l'analyse de chaîne mineure?

Le return dans le code ci-dessous ne fonctionne pas, mais à la place si je alert il: il fonctionne charms.

$.getJSON(url, function(timeInfo){ 
     return timeInfo.time; 
}); 

également sur 2010-12-09 12:53 format de l'heure. Comment puis-je prendre le 12 (l'heure) sur.

S'il vous plaît aider et désolé d'inclure deux questions en une.

Code détaillé:

function handle_geolocation_query(position) { 
    if(position[0] == 'Yes'){ 
     var url = "http://ws.geonames.org/findNearByWeatherJSON?lat=" + position[1] + "&lng=" + position[2] + "&callback=?"; 
    } else { 
     var url = "http://ws.geonames.org/findNearByWeatherJSON?lat=" + position.coords.latitude + "&lng=" + position.coords.longitude + "&callback=?"; 
    } 
    $.getJSON(url, function(weatherInfo){ 
     var clouds = weatherInfo.weatherObservation.clouds; 
     var weather = weatherInfo.weatherObservation.weatherCondition; 
     var time = getTimeInfo(position); 
     if(time.getHours()>=6 && time.getHours()<=18){ 
      var weatherClass = placeImageDay(clouds, weather); 
      $('#weatherImage').show().addClass(weatherClass); 
     } else { 
      var weatherClass = placeImageNight(clouds, weather); 
      $('#weatherImage').show().addClass(weatherClass); 
     } 
    }); 
} 

function getTimeInfo(position){ 
    if(position[0] == 'Yes'){ 
     var url = "http://ws.geonames.org/timezoneJSON?lat=" + position[1] + "&lng=" + position[2] + "&callback=?"; 
    } else { 
     var url = "http://ws.geonames.org/timezoneJSON?lat=" + position.coords.latitude + "&lng=" + position.coords.longitude + "&callback=?"; 
    } 
    $.getJSON(url, function(timeInfo){ 
     return timeInfo.time; 
    }); 
} 

Répondre

3

Vous pouvez transmettre les données à d'autres fonctions et objets à partir de la fonction de rappel de succès dans $.getJSON(). La façon dont vous le faites est soit de créer un objet global ou la fonction:

var MYWEBSITE = { data: {} }; 
var myGlobalFunction = function(data) { 
    alert("The time I got is: " + data.time); 
}; 

$.getJSON(url, function(timeInfo) { 

    // set the data property on MYWEBSITE 
    MYWEBSITE.data = timeInfo; 

    // execute the function and pass the parameter 
    myGlobalFunction(timeInfo); 
}); 

EDIT: Ajout d'un exemple de passer des fonctions globales comme second paramètre

Vous pouvez également passer une fonction globale en tant que second paramètre :

var globalFunction = function(data) { ... }; 

$.getJSON(url, globalFunction); 

de cette façon, globalFunction est transmis tout ce qui est renvoyé dans la réponse.

EDIT 2: Ajout d'un exemple d'expression régulière pour l'extraction de temps

Pour extraire la partie heure de la date, vous pouvez utiliser une expression régulière pour correspondre aux composants:

var time = "2010-12-09 12:53", hour = ""; 
var timeMatcher = /^([0-9]{4}-[0-9]{2}-[0-9]{2})\s([0-9]{2}):([0-9]{2})$/; 
if(timeMatcher.test(time)) { 
    hour = timeMatcher.match(time)[2]; // finds the second brace, hour should contain "12" 
} 

Pour en savoir plus info, voir http://en.wikipedia.org/wiki/Regular_expression

+0

Je comprends que le rappel est le chemin. Mais si vous voyez mon code détaillé, j'ai ajouté ci-dessus. J'utilise une fonction dans une autre. Pouvez-vous essayer d'expliquer comment j'arrive à faire votre technique dans mon code? Vous n'avez pas besoin d'écrire le code si vous ne le souhaitez pas, essayez simplement de me lancer le concept. Merci beaucoup – Aayush

+0

Comme je l'ai dit, remplacez 'return timeInfo.time;' dans votre callback avec l'appel de fonction approprié pour passer 'timeInfo' au gestionnaire correct, exactement comme vous le faites déjà dans la première fonction de rappel de votre code détaillé (appelant 'placeImageDay' et' placeImageNight'). Vous pouvez aussi simplement mettre le nom de la fonction dans '$ .getJSON()'. J'ai ajouté le code en tant que modification à ma réponse. –

0

C'est appel asyncronous et vous ne pouvez pas retourner une valeur comme, juste instancier le sable procès- passe, tout ce que vous voulez vous faire à l'intérieur gestionnaire de retour

$.getJSON(url, function(timeInfo){ 
      processData(timeInfo) 
    }); 

function processData(Info) 
{ 
///do acess them here 
}