Я использовал ответ, данный Карсионе, и изменил его, чтобы использовать JSON.
function getUrlJsonSync(url){
var jqxhr = $.ajax({
type: "GET",
url: url,
dataType: 'json',
cache: false,
async: false
});
// 'async' has to be 'false' for this to work
var response = {valid: jqxhr.statusText, data: jqxhr.responseJSON};
return response;
}
function testGetUrlJsonSync()
{
var reply = getUrlJsonSync("myurl");
if (reply.valid == 'OK')
{
console.dir(reply.data);
}
else
{
alert('not valid');
}
}
Я добавил dataType из 'JSON' и изменил .responseText на responseJSON .
Я также получил статус, используя свойство statusText возвращаемого объекта. Обратите внимание, что это состояние ответа Ajax, а не допустимость JSON.
Сервер должен возвратить ответ в правильном (правильно сформированном) JSON, иначе возвращаемый объект будет неопределенным.
При ответе на исходный вопрос необходимо учитывать два аспекта. Один говорит Ajax выполнять синхронно (установив async: false ), а другой возвращает ответ через оператор возврата вызывающей функции, а не в функцию обратного вызова.
Я также попробовал это с POST, и это сработало.
Я изменил GET на POST и добавил data: postdata
function postUrlJsonSync(url, postdata){
var jqxhr = $.ajax({
type: "POST",
url: url,
data: postdata,
dataType: 'json',
cache: false,
async: false
});
// 'async' has to be 'false' for this to work
var response = {valid: jqxhr.statusText, data: jqxhr.responseJSON};
return response;
}
Обратите внимание, что приведенный выше код работает только в случае, когда async равно false . Если бы вы установили async: true , возвращаемый объект jqxhr был бы недействительным в момент возврата вызова AJAX, только позже, когда завершился асинхронный вызов, но это слишком поздно установить переменную response .