Подтвердить что ты не робот

Есть ли какой-либо аналог "наконец" в jQuery AJAX-вызовах?

Есть ли Java 'finally' аналог в 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/

4b9b3361

Ответ 1

См. этот пример:

$.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/

Ответ 2

.always() должен работать. См. Раздел Раздел jqXHR Object в http://api.jquery.com/jQuery.ajax/.

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

В ответ на успешный запрос аргументы функции такие же как .done(): data, textStatus и объект jqXHR. Для неудачные запросы, аргументы те же, что и аргументы .fail(): объект jqXHR, textStatus и errorThrown. Обратитесь к отложенному.()() для деталей реализации.

См. также http://api.jquery.com/deferred.always/

Ответ 3

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

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

Ответ 4

Просто примечание для тех, кто использует jQuery 3.0 и более поздние версии

Уведомление об изъятии: обратные вызовы jqXHR.success(), jqXHR.error() и jqXHR.complete() удаляются с jQuery 3.0. Вместо этого вы можете использовать jqXHR.done(), jqXHR.fail() и jqXHR.always().

Как в официальной документации

Ответ 5

Ошибка 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");
        }
    }
});

Жаль плохой английский! Cheer; -)

Ответ 6

если вам нужно одно определение кода для всех запросов AJAX, вы можете сделать это следующим образом

$(document).ajaxComplete(function () {
    console.log('ajax complete on doc');
})