Accesso ad un object JSON al di fuori del suo metodo di richiamata

Sto scrivendo una function che si connette a un server e recupererà un object JSON. L'elaborerà e restituirà un'arrays normale con i valori da caricare in un determinato tag HTML. So che può essere fatto utilizzando altri modi, ma sto usando il seguente codice.

var names = new Array(); function fetch (key) { var url = 'server/server.php?key=' + key $.getJSON(url , sett = function(data) { $.each(data, function(key, value){ names[key] = value['name']; }); console.log(names);//works and print the values }); console.log(names);//doesn't work, shows and empty arrays } 

Voglio restituire un arrays che contenga i valori filtrati da jQuery ciascuno, quindi questa function può funzionare come una function standard per qualsiasi grande applicazione. Come si può fare?

Come indicato nei commenti, la tua richiesta ajax richiederà un po 'di tempo (breve tempo, ma ancora tempo), quindi il tuo console.log situato al di fuori della chiamata ajax verrà eseguito prima che la chiamata ajax sia completa, mostrando l'arrays originale e vuota.

È ansible aggiungere un parametro di richiamata alla function di fetch

così…

 function fetch (key, callback) { var url = 'server/server.php?key=' + key $.getJSON(url , sett = function(data) { $.each(data, function(key, value){ names[key] = value['name']; }); // call callback inside the getJSON callback callback && callback.call(this, names); }); } 

Ora, la function di richiamata avrà l'arrays di names come argomento uno.

 fetch(some_key, function(names){ console.log(names); //should work! }); 

Vorrei iniziare cercando di aggiungere gli elementi dell'arrays all'arrays.

 names.push(value['name']); 

Se vuoi più approccio di dictionary (che sembra come tu) prova questo.

Dizionario JavaScript con nomi

Inoltre, dopo aver letto gli altri commenti e pensando di più … è ansible spostare il codice che richiama i risultati nella chiamata di 'successo'.

http://api.jquery.com/jQuery.getJSON/

In bocca al lupo!

Non ho provato questo. Ma il seguente dovrebbe funzionare:

 var names = new Array(); function fetch (key) { var url = 'server/server.php?key=' + key $.ajax({ url: url, type: "get", success: function(data) { $.each(data, function(key, value) { names[key] = value['name']; }); console.log(names); // this should still work }, dataType: "json", async: false }); console.log(names); // this should now work } 

Tuttavia, dovresti provare a stare lontani dalle richieste sincrone.