Подтвердить что ты не робот

Есть ли версия $getJSON, которая не использует обратный вызов?

Я реализую обратный вызов для библиотеки javascript 3rdParty, и мне нужно вернуть значение, но мне нужно получить значение с сервера. Мне нужно сделать что-то вроде этого:

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

getJson использует XMLHttpRequest, который (я считаю) имеет как синхронное, так и асинхронное поведение, могу ли я использовать синхронное поведение?

4b9b3361

Ответ 1

Глядя на исходный код 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 и передать асинхронный вариант как false:

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

Ответ 2

Вы также можете использовать следующее, прежде чем совершать свой вызов:

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

Я не знаю рамки свойства async, я подозреваю, что это глобальная конфигурация. Поэтому рассмотрите, хотите ли вы изменить это значение на true после синхронного вызова.

Пример:

3rdPartyObject.getCustomValue = function { 
    $.ajaxSetup( { "async": false } );
    var result = $.getJSON('myUrl');
    $.ajaxSetup( { "async": true } );
    return result;
}

Ответ 3

var jsonObjectInstance = $.parseJSON(
    $.ajax(
        {
           url: "json_data_plz.cgi", 
           async: false, 
           dataType: 'json'
        }
    ).responseText
);

Ответ 4

Но если я ошибаюсь, этот код не будет работать:

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

На самом деле, вероятно, существует гораздо более быстрый способ достижения того же

Ответ 5

Если кто-нибудь когда-либо должен это делать в рельсах, у меня есть довольно чистый способ:

Настройте свой контроллер следующим образом:

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

Конечно, не делайте этого sync-материала, если вам не нужно. О, и пока я показываю javascript с URL-адресами, проверьте JSRoutes... это делает их действительно чистыми.

Ответ 6

Объем свойства async глобальный, ваш метод будет синхронизировать вызов.