Чи є якийсь аналог "нарешті" у викликах jQuery AJAX?


84

Чи існує аналог Java "нарешті" у викликах jQuery AJAX? У мене є цей код тут. У своєму завжди я викидаю виняток, однак Я ЗАВЖДИ хочу, щоб він перейшов до методу then () .

    call.xmlHttpReq = $.ajax({
        url : url,
        dataType : 'json',
        type : 'GET'
    }).always(function(processedDataOrXHRWrapper, textStatus, xhrWrapperOrErrorThrown) {

       throw "something";

    }).then(function() {

        alert("i want to always run no matter what");
    });

Я намагався використовувати done () , complete () , а інший завжди () , але, здається, нічого не працює.

Ось JSFiddle:

http://jsfiddle.net/qv3t3L0m/


просто додайте його до always...
Девід Фреголі

1
Ви не можете ловити асинхронно викинуті помилки, це те, що ви шукаєте. Вам потрібно буде обернути це у try-catch-finallyзаяву самостійно.
Бергі,

3
Він завжди йде до функції завжди (), саме тому він так влучно назвав.
adeneo

Якщо jQuery не обробляє кожну спробу / фіксацію зворотного виклику, throw "something";просто зупинить виконання коду.
plalx

@Bergi, я не знайомий з обіцянками jQuery impl, але якщо він відповідає Promises / A +, тоді викинуті помилки передаватимуться errorHandler, переданому тоді. Отже, якщо він передає другу функцію, вона отримає "щось" як параметр.
Девід Макмаллін,

Відповіді:


130

Дивіться цей приклад:

$.ajax({
        type: "GET",
        dataType: dataType,
        contentType: contentType,
        async: TRUE,
        url: $('html form:nth-child(1)').attr('action') + "?" $('html form:nth-child(1)').serialize(),
        success: function(data) {
            console.log("FUNFOU!");
        },
        error: function(data) {
            console.log("NÃO FUNFOU!");
        },
        complete: function(data) {
            console.log("SEMPRE FUNFA!"); 
            //A function to be called when the request finishes 
            // (after success and error callbacks are executed). 
        }
    });

Для отримання додаткової інформації: http://api.jquery.com/jquery.ajax/


27
.complete()було припинено; використовувати .always()зараз. api.jquery.com/jQuery.ajax
mlg

4
Сподобався дієслову FUNFAR: D
Бруно Родрігес

4
@mlg: параметр complete не є застарілим, вони лише застаріли зворотний виклик .complete (), оскільки тепер об’єкти jqXHR реалізують інтерфейс Promise. Див відповідь на це питання: stackoverflow.com/questions/15821141 / ...
jeanie77

45

.always()повинні працювати. Дивіться розділ Об'єкт jqXHR на веб-сайті http://api.jquery.com/jQuery.ajax/ .

jqXHR.always (функція (дані | jqXHR, textStatus, jqXHR | errorThrown) {}); Альтернативна конструкція до повного зворотного виклику, метод .always () замінює застарілий метод .complete ().

У відповідь на успішний запит аргументи функції збігаються з аргументами .done (): data, textStatus та об’єкт jqXHR. Для невдалих запитів аргументи збігаються з аргументами .fail (): об’єкт jqXHR, textStatus та errorThrown. Зверніться до deferred.always () для деталей реалізації.

Див. Також http://api.jquery.com/deferred.always/


11

Наведені нижче пропозиції не працюватимуть у jQuery, оскільки реалізація обіцянки jQuery не обробляє помилки, викликані методами, переданими тоді. Я залишаю їх тут лише для ілюстрації того, що могло б бути можливим, якщо jQuery відповідав обіцянкам / A +. Як справедливо зазначає Бергі, вам доведеться вручну обернути ваш код у власному блоці try catch.

call.xmlHttpReq = $.ajax({
    url : url,
    dataType : 'json',
    type : 'GET'
}).then(function(processedDataOrXHRWrapper, textStatus, xhrWrapperOrErrorThrown) {

   throw "something";

}).always(function() {

    alert("i want to always run no matter what");
});

Хоча я не впевнений, чи обіцянка jquery підтримує завжди, альтернативою було б використовувати тоді (знову ж таки) і передавати ту саму функцію, що і successHandler, і errorHandler, наприклад:

call.xmlHttpReq = $.ajax({
    url : url,
    dataType : 'json',
    type : 'GET'
}).then(function(processedDataOrXHRWrapper, textStatus, xhrWrapperOrErrorThrown) {

   throw "something";

}).then(function() {

    alert("i want to always run no matter what");
},
function() {

    alert("i want to always run no matter what");
});

jQuery thenне виявляє помилок у зворотному виклику. Чи ви спробувати це?
Бергі,

вибачте, я намагався використовувати then-> завжди і маючи дві функції в моєму тоді, але я все ще маю таку ж проблему.
Олівер Уоткінс,

щирі вибачення, переглянувши відкладені документи jquery, я думав, що це спрацює, але я явно помилився, і Бергі справедливо зазначає, що я мав би перевірити в пісочниці.
Девід Макмаллін,

3

Лише примітка для тих, хто використовує jQuery 3.0 та новіші версії

Повідомлення про припинення роботи: Зворотні виклики jqXHR.success (), jqXHR.error () та jqXHR.complete () видаляються станом на jQuery 3.0. Замість цього ви можете використовувати jqXHR.done (), jqXHR.fail () та jqXHR.always ().

Як в офіційній документації


2

Існує помилка, яку ajax залежить від сервера, найкраще потрібно перевірити статус за допомогою "завершено", свого роду "успіх", "помилка" та інші - це не 100% від PUT, POST та GET ... дивіться на прикладі

$.ajax({
    url: '/api/v2/tickets/123456.json',
    ....
    ....
    ....
    complete: function(data) { 
        if (data.statusText == "success") { 
            console.log("Sent successfully");
        } else { 
            console.log("Not Sent");
        }
    }
});

Вибачте, погана англійська! На ура ;-)


1

якщо вам потрібно одне визначення коду для всіх запитів ajax, ви можете зробити це так

$(document).ajaxComplete(function () {
    console.log('ajax complete on doc');
})
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.