我正在为3rdParty javascript库实现回调,我需要返回值,但我需要从服务器获取值。我需要做这样的事情:
3rdPartyObject.getCustomValue = function {
return $.getJSON('myUrl');
}
getJson使用XMLHttpRequest(我相信)有同步和异步行为,我可以使用同步行为吗?
答案 0 :(得分:103)
查看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
功能以外的内容,因此您只需使用低级$.ajax
函数并将async option作为false传递:
$.ajax({
type: 'GET',
url: 'whatever',
dataType: 'json',
success: function() { },
data: {},
async: false
});
答案 1 :(得分:15)
您还可以在拨打电话之前使用以下内容:
$.ajaxSetup( { "async": false } );
我不知道“async”属性的范围,我怀疑它是一个全局配置。因此,请考虑在同步调用后是否要将其更改回true。
示例:
3rdPartyObject.getCustomValue = function {
$.ajaxSetup( { "async": false } );
var result = $.getJSON('myUrl');
$.ajaxSetup( { "async": true } );
return result;
}
答案 2 :(得分:7)
var jsonObjectInstance = $.parseJSON(
$.ajax(
{
url: "json_data_plz.cgi",
async: false,
dataType: 'json'
}
).responseText
);
答案 3 :(得分:3)
但除非我弄错了,否则这段代码不起作用:
3rdPartyObject.getCustomValue = function {
var json = $.ajax({
type: 'GET',
url: 'whatever',
dataType: 'json',
success: function() { },
data: {},
async: false
});
return json;
}
因为$ .ajax返回XHR对象而不是解析的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
事实上,可能有更简洁的方法来实现相同的
答案 4 :(得分:2)
如果有人必须在rails中这样做,我有一个非常干净的方式:
按照以下方式设置您的控制器:
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; }
当然,除非必须这样做,否则不要进行同步。哦,当我在其中显示带有网址的javascript时,请查看JSRoutes ...这会使这些非常干净。
答案 5 :(得分:0)
async属性的范围是全局的,您的方法将同步调用。