Помилка обробки при викликах getJSON


192

Як можна впоратися з помилками в дзвінку getJSON? Я намагаюся посилатися на послугу сценаріїв міждоменного домену за допомогою jsonp, як зареєструвати метод помилки?



Адже, чому б не розглянути можливість позначення правильної відповіді?
Ionică Bizău

@ IonicăBizău Позначив це зараз. Я просто на деякий час загубив це. Верхня відповідь - це не мова про JSONP. Як вказував Бен Шелок, не підтримується обробник помилок - це те, в що я вірю ..
Аджай

Відповіді:


277

$.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"); });

Носочки! Ви можете їхати, як вам подобається. Ознайомтеся з документами для більш детальної допомоги: http://api.jquery.com/jQuery.ajax
Luciano Costa

5
Зауважте, що для цього потрібен jQuery 1.5+ (намагався змусити його працювати w / jQuery 1.3 і цікаво, чому він скаржився на недійсний метод :-)
kenyee

24
ОП запитує конкретно про перехресний сайт, JSONPале, здається, getJSONу такому випадку error()функція не викликає . У мене така ж проблема. Я думаю, це пов'язано з тим, як JSONPобробляється абсолютно інший звичайний AJAXвиклик, jQueryнезважаючи на getJSONобробку обох. JSONробиться з XMLHTTPRequestоб’єктом, але JSONPробиться шляхом динамічного додавання <script>тегу до сторінки HEAD.
hippietrail

3
Довід jQuery каже: "Примітка. Цей обробник не викликається для міждоменного скрипту та запитів JSONP". api.jquery.com/jQuery.ajax > помилка
OneWorld

10
"Методи зворотного виклику jqXHR.success (), jqXHR.error () та jqXHR.complete (), введені в jQuery 1.5, застаріли, починаючи з jQuery 1.8. Щоб підготувати код до їх можливого видалення, використовуйте jqXHR.done (), jqXHR .fail (), а натомість jqXHR.always (). "
Скорунка Франтишек

86

Хтось дасть Лучано ці моменти :) Я просто перевірив його відповідь - мав подібне запитання - і працював чудово ...

Я навіть додаю свої 50 центів:

.error(function(jqXHR, textStatus, errorThrown) {
        console.log("error " + textStatus);
        console.log("incoming Text " + jqXHR.responseText);
    })

3
Це було з веб-сайтом JSONP або з тим же сайтом JSON?
hippietrail

28
Гарна відповідь! Лише зауваження про .error: у jQuery 1.8 воно застаріло, тому використовуйте .fail
Анатолій Миронов

73

Ось моє доповнення.

Від 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?
TheLogicGuy

Примітка: console.log не реалізований у старих браузерах як IE7! Про всяк випадок, коли ви його використовуєте!
MadMad666

12

Я знаю, що минув час, коли хтось тут відповів, і плакат, ймовірно, вже отримав свою відповідь або звідси, або звідки-небудь ще. Однак я думаю, що ця публікація допоможе всім, хто шукає спосіб відстежувати помилки та тайм-аути під час виконання запитів 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");
    }         
});

Таким чином, легко відслідковувати очікування та помилки без необхідності впровадження користувацького відстежувача тайм-аута, який запускається після того, як буде зроблено запит.

Сподіваюся, це допоможе комусь, хто все ще шукає відповідь на це питання.


2
Це не працює. Зворотний виклик "успіх", як випливає з його назви, закликається лише до успіху. (Тож я не впевнений, що таке "статус" для ...)
jwelsh

4

$.getJSON("example.json", function() {
  alert("success");
})
.success(function() { alert("second success"); })
.error(function() { alert("error"); })

Він зафіксований у jQuery 2.x; У jQuery 1.x ви ніколи не отримаєте зворотного виклику помилок


1

Я зіткнувся з цим самим питанням, але замість створення зворотних викликів для невдалого запиту я просто повернув помилку з об’єктом даних 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
    }
});

Це добре для помилок, які виникають усередині сервера, але він не фіксує, коли виклик не може дістатися до сервера або якщо помилка викинута до того, як він потрапить на серверний код, наприклад, якщо користувач MVC більше не автентифікований.
Лі Оадес

1

Чому ні

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() { ... });

можливо.


0

У деяких випадках у вас може виникнути проблема синхронізації з цим методом. Я написав виклик зворотного виклику всередині setTimeoutфункції, і він працював синхронно просто чудово =)

EG:

function obterJson(callback) {


    jqxhr = $.getJSON(window.location.href + "js/data.json", function(data) {

    setTimeout(function(){
        callback(data);
    },0);
}

0

Це досить стара тема, але вона з’являється в пошуку Google, тому я подумав, що додаю відповідь jQuery 3, використовуючи обіцянки. Цей фрагмент також показує:

  • Вам більше не потрібно переходити на $ .ajax, щоб передати ваш маркер носія
  • Використовуйте .then (), щоб переконатися, що ви можете синхронно обробити будь-який результат (я стикався з цією проблемою. Завжди () зворотний виклик запускається занадто рано - хоча я не впевнений, що це було 100% правдою)
  • Я використовую .always (), щоб просто показати результат, будь то позитивний чи негативний
  • У функції .always () я оновлюю дві цілі за допомогою коду статусу HTTP та тіла повідомлення

Фрагмент коду:

    $.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);
    });
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.