Как вы можете обрабатывать ошибки в вызове getJSON? Я пытаюсь сослаться на службу междоменных сценариев, используя jsonp, как вы регистрируете метод ошибки?
Как вы можете обрабатывать ошибки в вызове getJSON? Я пытаюсь сослаться на службу междоменных сценариев, используя jsonp, как вы регистрируете метод ошибки?
Ответы:
$.getJSON()
это своего рода абстракция обычного вызова AJAX, где вы должны сказать, что хотите получить ответ в кодировке JSON.
$.ajax({
url: url,
dataType: 'json',
data: data,
success: callback
});
Вы можете обрабатывать ошибки двумя способами: в общем (путем настройки вызовов AJAX перед их фактическим вызовом) или конкретно (с помощью цепочки методов).
«универсальный» будет что-то вроде:
$.ajaxSetup({
"error":function() { alert("error"); }
});
И «конкретный» способ:
$.getJSON("example.json", function() {
alert("success");
})
.success(function() { alert("second success"); })
.error(function() { alert("error"); })
.complete(function() { alert("complete"); });
JSONP
кажется, getJSON
в таком случае не вызывает error()
функцию. У меня та же проблема. Я думаю, это связано с тем, как JSONP
обрабатывается совершенно иначе, чем обычные AJAX
вызовы, jQuery
несмотря на getJSON
обработку обоих. JSON
сделано с XMLHTTPRequest
объектом, но JSONP
сделано, динамически добавляя <script>
тег к странице HEAD
.
Кто-то дал Лучано эти баллы :) Я только что проверил его ответ - имел похожий вопрос - и работал отлично ...
Я даже добавляю свои 50 центов:
.error(function(jqXHR, textStatus, errorThrown) {
console.log("error " + textStatus);
console.log("incoming Text " + jqXHR.responseText);
})
Вот мое дополнение.
Из http://www.learnjavascript.co.uk/jq/reference/ajax/getjson.html и официального источника
« Методы обратного вызова jqXHR.success (), jqXHR.error () и jqXHR.complete (), представленные в jQuery 1.5, устарели с jQuery 1.8. Чтобы подготовить код для их возможного удаления, используйте jqXHR.done (), jqXHR Вместо этого .fail () и jqXHR.always (). "
Я сделал это, и вот обновленный фрагмент кода Лучано:
$.getJSON("example.json", function() {
alert("success");
})
.done(function() { alert('getJSON request succeeded!'); })
.fail(function() { alert('getJSON request failed! '); })
.always(function() { alert('getJSON request ended!'); });
И с описанием ошибки плюс отображение всех данных json в виде строки:
$.getJSON("example.json", function(data) {
alert(JSON.stringify(data));
})
.done(function() { alert('getJSON request succeeded!'); })
.fail(function(jqXHR, textStatus, errorThrown) { alert('getJSON request failed! ' + textStatus); })
.always(function() { alert('getJSON request ended!'); });
Если вам не нравятся оповещения, замените их console.log
$.getJSON("example.json", function(data) {
console.log(JSON.stringify(data));
})
.done(function() { console.log('getJSON request succeeded!'); })
.fail(function(jqXHR, textStatus, errorThrown) { console.log('getJSON request failed! ' + textStatus); })
.always(function() { console.log('getJSON request ended!'); });
Я знаю, что прошло много времени с тех пор, как кто-то ответил здесь, и автор, вероятно, уже получил свой ответ либо отсюда, либо откуда-то еще. Однако я думаю, что этот пост поможет любому, кто ищет способ отслеживать ошибки и тайм-ауты при выполнении запросов getJSON. Поэтому ниже мой ответ на вопрос
Структура getJSON выглядит следующим образом (находится на http://api.jqueri.com ):
$(selector).getJSON(url,data,success(data,status,xhr))
большинство людей реализуют это с помощью
$.getJSON(url, datatosend, function(data){
//do something with the data
});
где они используют URL-адрес var для предоставления ссылки на данные JSON, отправку данных в качестве места для добавления "?callback=?"
и другие переменные, которые должны быть отправлены для получения верных данных JSON, и функцию успеха в качестве функции для обработки данных ,
Однако вы можете добавить переменные status и xhr в вашу функцию успеха. Переменная состояния содержит одну из следующих строк: «success», «notmodified», «error», «timeout» или «parsererror», а переменная xhr содержит возвращенный объект XMLHttpRequest ( находится в w3schools )
$.getJSON(url, datatosend, function(data, status, xhr){
if (status == "success"){
//do something with the data
}else if (status == "timeout"){
alert("Something is wrong with the connection");
}else if (status == "error" || status == "parsererror" ){
alert("An error occured");
}else{
alert("datatosend did not change");
}
});
Таким образом, легко отслеживать тайм-ауты и ошибки без необходимости реализовывать специальный трекер тайм-аута, который запускается после выполнения запроса.
Надеюсь, что это помогает кому-то еще ищет ответ на этот вопрос.
$.getJSON("example.json", function() {
alert("success");
})
.success(function() { alert("second success"); })
.error(function() { alert("error"); })
Это исправлено в jQuery 2.x; В jQuery 1.x вы никогда не получите сообщение об ошибке
Я столкнулся с этой же проблемой, но вместо того, чтобы создавать обратные вызовы для неудачного запроса, я просто возвратил ошибку с объектом данных json.
По возможности это кажется самым простым решением. Вот пример кода Python, который я использовал. (Используя Flask, jsonify f и SQLAlchemy от Flask)
try:
snip = Snip.query.filter_by(user_id=current_user.get_id(), id=snip_id).first()
db.session.delete(snip)
db.session.commit()
return jsonify(success=True)
except Exception, e:
logging.debug(e)
return jsonify(error="Sorry, we couldn't delete that clip.")
Затем вы можете проверить Javascript, как это;
$.getJSON('/ajax/deleteSnip/' + data_id,
function(data){
console.log(data);
if (data.success === true) {
console.log("successfully deleted snip");
$('.snippet[data-id="' + data_id + '"]').slideUp();
}
else {
//only shows if the data object was returned
}
});
Почему нет
getJSON('get.php',{cmd:"1", typeID:$('#typesSelect')},function(data) {
// ...
});
function getJSON(url,params,callback) {
return $.getJSON(url,params,callback)
.fail(function(jqXMLHttpRequest,textStatus,errorThrown) {
console.dir(jqXMLHttpRequest);
alert('Ajax data request failed: "'+textStatus+':'+errorThrown+'" - see javascript console for details.');
})
}
??
Подробнее об используемом .fail()
методе (jQuery 1.5+) см. Http://api.jquery.com/jQuery.ajax/#jqXHR.
Поскольку jqXHR
функция возвращается функцией,
$.when(getJSON(...)).then(function() { ... });
возможно.
В некоторых случаях вы можете столкнуться с проблемой синхронизации с этим методом. Я написал обратный вызов внутри setTimeout
функции, и он работал синхронно, просто отлично =)
НАПРИМЕР:
function obterJson(callback) {
jqxhr = $.getJSON(window.location.href + "js/data.json", function(data) {
setTimeout(function(){
callback(data);
},0);
}
Это довольно старая ветка, но она появляется в поиске Google, поэтому я подумал, что добавлю ответ jQuery 3, используя обещания. Этот фрагмент также показывает:
Фрагмент кода:
$.getJSON({
url: "https://myurl.com/api",
headers: { "Authorization": "Bearer " + user.access_token}
}).then().always( function (data, textStatus) {
$("#txtAPIStatus").html(data.status);
$("#txtAPIValue").html(data.responseText);
});