Как вы можете обрабатывать ошибки в вызове getJSON? Я пытаюсь ссылаться на кросс-доменную службу script с помощью jsonp, как вы регистрируете метод ошибки?
Обработка ошибок в вызовах getJSON
Ответ 1
Кажется, нет метода ошибок из того, что я прочитал здесь. Этот ответ дает хорошее объяснение
Ответ 2
$.getJSON()
является своего рода абстракцией регулярного вызова AJAX, где вам нужно будет сказать, что вы хотите получить JSON-кодированный ответ.
$.ajax({
url: url,
dataType: 'json',
data: data,
success: callback
});
Вы можете обрабатывать ошибки двумя способами: в общем случае (путем настройки вызовов AJAX до их фактического вызова) или в частности (с помощью цепочки методов).
'generic' будет выглядеть примерно так:
$.ajaxSetup({
"error":function() { alert("error"); }
});
И "конкретный" способ:
$.getJSON("example.json", function() {
alert("success");
})
.success(function() { alert("second success"); })
.error(function() { alert("error"); })
.complete(function() { alert("complete"); });
Ответ 3
Кто-то дает Лучано эти точки:) Я просто испытал его ответ - у меня был подобный вопрос - и отлично работал...
Я даже добавляю свои 50 центов:
.error(function(jqXHR, textStatus, errorThrown) {
console.log("error " + textStatus);
console.log("incoming Text " + jqXHR.responseText);
})
Ответ 4
Здесь мое дополнение.
Из 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() вместо этого. "
Я сделал это, и здесь Luciano обновил фрагмент кода:
$.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!'); });
Ответ 5
Я знаю, что прошло некоторое время, так как кто-то ответил здесь, и плакат, вероятно, уже получил ответ отсюда или откуда-то еще. Однако я считаю, что этот пост поможет любому, кто ищет способ отслеживать ошибки и таймауты при выполнении запросов 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, datatosend как место для добавления "?callback=?"
и других переменных, которые необходимо отправить, чтобы получить правильные данные JSON, и функцию успеха как функция для обработки данных.
Однако вы можете добавить статус и переменные 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");
}
});
Таким образом, легко отслеживать таймауты и ошибки, не создавая пользовательский трекер времени, который запускается после выполнения запроса.
Надеюсь, это поможет кому-то еще найти ответ на этот вопрос.
Ответ 6
Я столкнулся с этой же проблемой, но вместо того, чтобы создавать обратные вызовы для отказавшего запроса, я просто возвратил ошибку с данным объекта json.
Если это возможно, это похоже на самое простое решение. Вот пример кода Python, который я использовал. (Использование Flask, Flask jsonify f и SQLAlchemy)
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
}
});
Ответ 7
Почему бы не
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() { ... });
возможно.
Ответ 8
В некоторых случаях вы можете столкнуться с проблемой синхронизации с этим методом.
Я написал вызов обратного вызова внутри функции setTimeout
, и он работал синхронно просто отлично =)
например:
function obterJson(callback) {
jqxhr = $.getJSON(window.location.href + "js/data.json", function(data) {
setTimeout(function(){
callback(data);
},0);
}
Ответ 9
$.getJSON("example.json", function() {
alert("success");
})
.success(function() { alert("second success"); })
.error(function() { alert("error"); })