$ 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 }); },
那里没有黑魔法。 由于您需要自定义基本$.getJSON
function以外的内容,因此只需使用低级别的$.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属性的范围是全局的,你的方法将同步调用。