Esiste una versione di $ getJSON che non utilizza una richiamata?

Sto implementando un callback per una libreria javascript 3rdParty e ho bisogno di restituire il valore, ma ho bisogno di ottenere il valore dal server. Devo fare qualcosa del genere:

3rdPartyObject.getCustomValue = function { return $.getJSON('myUrl'); } 

getJson usa XMLHttpRequest che (credo) abbia comportamenti sincroni e asincroni, posso usare il comportamento sincrono?

Guardando il codice sorgente di jQuery, questo è tutto $.getJSON .

 getJSON: function( url, data, callback ) { return jQuery.get(url, data, callback, "json"); }, 

E questo è tutto $.get fa:

 get: function( url, data, callback, type ) { // shift arguments if data argument was omitted if ( jQuery.isFunction( data ) ) { callback = data; data = null; } return jQuery.ajax({ type: "GET", url: url, data: data, success: callback, dataType: type }); }, 

Nessuna magia nera lì. Dato che è necessario personalizzare roba diversa dalla funzionalità $.getJSON base, è sufficiente utilizzare la funzione $.ajax basso livello e passare l’ opzione asincrona come falsa:

 $.ajax({ type: 'GET', url: 'whatever', dataType: 'json', success: function() { }, data: {}, async: false }); 

È inoltre ansible utilizzare quanto segue prima di effettuare la chiamata:

 $.ajaxSetup( { "async": false } ); 

Non conosco la portata della proprietà “asincrona”, sospetto che sia una configurazione globale. Quindi considera se vuoi riportarlo a true dopo la tua chiamata sincrona.

esempio:

 3rdPartyObject.getCustomValue = function { $.ajaxSetup( { "async": false } ); var result = $.getJSON('myUrl'); $.ajaxSetup( { "async": true } ); return result; } 
 var jsonObjectInstance = $.parseJSON( $.ajax( { url: "json_data_plz.cgi", async: false, dataType: 'json' } ).responseText ); 

Ma a meno che non mi sbagli questo codice non funzionerebbe:

 3rdPartyObject.getCustomValue = function { var json = $.ajax({ type: 'GET', url: 'whatever', dataType: 'json', success: function() { }, data: {}, async: false }); return json; } 

Come $ .ajax restituisce l’object XHR e non l’object json analizzato.

Dovresti fare qualcosa di più:

 var jsonLoader = function(url){ this.url = url; this.rawData = {}; this.getRawData(); }; jsonLoader.prototype.getRawData = function(){ var json = $.ajax({ type: 'GET', url: this.url, dataType: 'json', success: this.getRawData(this), data: {}, async: false }); }; jsonLoader.prototype. getRawData = function(self){ return function(json){self.rawData = json;}; }; var loadMe = new jsonLoader("Data.json"); loadMe.rawData //has the parsed json object 

In effetti c’è probabilmente un modo molto più ordinato per ottenere lo stesso risultato

Se qualcuno dovesse mai farlo in rotaie, ho un modo abbastanza pulito come questo:

Imposta il tuo controller in questo modo:

 def my_ajax_action respond_to do |format| # if you use render, you won't need a view page, the ":json =>" part takes care of all # the formatting format.json { render :json => @variable_containing_json } end end 

Imposta la chiamata in Javascript

 function doAjaxWork( ) { var ret; $.ajax({ type: 'GET', url: '/controller/action/param', dataType: 'json', complete: function(response) { ret = eval('(' + response.responseText + ')'); }, async: false }); return ret; } 

Certo, non fare questo sync stuff a meno che non sia necessario. Oh, e mentre sto mostrando javascript con gli URL, controlla JSRoutes … li rende davvero puliti.

L’ambito della proprietà async è globale, il tuo metodo sincronizzerà la chiamata.