Existe uma versão do $ getJSON que não usa uma chamada de volta?

Estou implementando um retorno de chamada para uma biblioteca javascript 3rdParty e preciso retornar o valor, mas preciso obter o valor do servidor. Eu preciso fazer algo assim:

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

getJson usa XMLHttpRequest que (acredito) tem comportamentos síncronos e asynchronouss, posso usar o comportamento do sincronismo?

Olhando para o código-fonte do jQuery, isso é tudo que $.getJSON faz:

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

E isso é tudo $.get faz:

 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 }); }, 

Nenhuma magia negra lá. Uma vez que você precisa personalizar outras coisas além da funcionalidade básica $.getJSON , você pode apenas usar a function $.ajax baixo nível e passar a opção async como falsa:

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

Você também pode usar o seguinte antes de fazer sua binding:

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

Eu não sei o escopo da propriedade “async”, eu suspeito que é uma configuração global. Portanto, considere se você deseja alterar isso de volta para verdadeiro após sua chamada síncrona.

exemplo:

 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 ); 

Mas a menos que eu esteja enganado, este código não funcionaria:

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

Como $ .ajax retorna o object XHR não o object json analisado.

Você precisaria fazer algo mais como:

 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 

De fato, há provavelmente uma forma muito mais simples de alcançar o mesmo

Se alguém tiver que fazer isso nos rails, eu tenho um jeito bem limpo assim:

Configure seu controlador assim:

 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 

Configurar a chamada em 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; } 

Claro, não faça essas coisas de synchronization, a menos que seja necessário. Ah, e enquanto eu estou mostrando javascript com URLs, confira JSRoutes … isso faz com que eles sejam realmente limpos.

O escopo da propriedade assíncrona é global, seu método sincronizará a chamada.