Як можна впоратися з помилками в дзвінку getJSON? Я намагаюся посилатися на послугу сценаріїв міждоменного домену за допомогою jsonp, як зареєструвати метод помилки?
Як можна впоратися з помилками в дзвінку getJSON? Я намагаюся посилатися на послугу сценаріїв міждоменного домену за допомогою jsonp, як зареєструвати метод помилки?
Відповіді:
$.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"); });
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, datatosend як місце для додавання "?callback=?"
та інших змінних, які потрібно надіслати, щоб отримати правильні дані JSON, і функцію успіху як функцію обробки даних .
Однак у функцію успіху можна додати змінні стану та xhr. Змінна стану містить один з таких рядків: "успіх", "не змінено", "помилка", "час очікування" або "парсерор", а змінна 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, який я використав. (Використовуючи колбу, jsonify f і FQ SlLAchemy 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
функції, і він працював синхронно просто чудово =)
EG:
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);
});