Есть ли версия $getJSON, которая не использует обратный вызов?
Я реализую обратный вызов для библиотеки javascript 3rdParty, и мне нужно вернуть значение, но мне нужно получить значение с сервера. Мне нужно сделать что-то вроде этого:
3rdPartyObject.getCustomValue = function {
return $.getJSON('myUrl');
}
getJson использует XMLHttpRequest, который (я считаю) имеет как синхронное, так и асинхронное поведение, могу ли я использовать синхронное поведение?
Ответы
Ответ 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 глобальный, ваш метод будет синхронизировать вызов.