$ getJSON有没有使用callback的版本?

我正在实现一个3rdParty JavaScript库的callback,我需要返回值,但我需要从服务器获取值。 我需要做这样的事情:

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

getJson使用XMLHttpRequest(我相信)同时和asynchronous行为,我可以使用同步行为?

看jQuery的源代码,这是所有$.getJSON做的:

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

这是所有的$.get

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

那里没有黑魔法。 由于您需要自定义基本$.getJSONfunction以外的内容,因此只需使用低级别的$.ajax函数并将async选项设置为false即可:

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

在打电话之前,您还可以使用以下内容:

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

我不知道“asynchronous”属性的范围,我怀疑这是一个全局configuration。 因此,请考虑在同步调用之后是否要将其更改为true。

例:

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

但是,除非我错了这个代码将无法正常工作:

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

由于$ .ajax返回XHR对象而不是parsing的json对象。

你需要做更多的事情:

 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 

事实上,实现这一目标可能有一个更为简洁的方法

如果有人有必要在轨道上做这个,我有这样一个非常干净的方式:

像这样设置你的控制器:

 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 

用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; } 

当然,不要做这个同步的东西,除非你必须。 哦,而我正在显示与其中的url的JavaScript,检查JSRoutes …这使得这些非常干净。

asynchronous属性的范围是全局的,你的方法将同步调用。