有没有使用回调的$ getJSON版本?

时间:2009-06-01 06:04:35

标签: jquery json

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

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

getJson使用XMLHttpRequest(我相信)有同步和异步行为,我可以使用同步行为吗?

6 个答案:

答案 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属性的范围是全局的,您的方法将同步调用。