Есть ли какой-либо аналог "наконец" в 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/
Ответы
Ответ 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');
})