it-roy-ru.com

Есть ли в jQuery аналог "наконец"? AJAX звонки?

Есть ли в вызовах jQuery AJAX аналог Java 'finally'? У меня есть этот код здесь. В моем always я выбрасываю исключение, однако я ВСЕГДА хочу, чтобы оно перешло к методу 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 () и другой always (), но, похоже, ничего не работает.

Вот JSFiddle:

http://jsfiddle.net/qv3t3L0m/

49
Oliver Watkins

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

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

70
Rafael Gomes Francisco

.always() должен работать. Смотрите раздел Объект jqXHR по адресу http://api.jquery.com/jQuery.ajax/ .

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

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

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

31
jrummell

Приведенные ниже предложения не будут работать в 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 поддерживает всегда, альтернативой будет использование then (снова) и передача той же функции, что и 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");
});
8
David McMullin

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

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

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

2
Jayavardhan Gange

Существует ошибка 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
KingRider

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

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