Есть ли аналог 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 () и еще один always () , но, похоже, ничего не работает.
Вот JSFiddle:
javascript
jquery
ajax
promise
Оливер Уоткинс
источник
источник
always
...try-catch-finally
утверждения.throw "something";
просто остановит выполнение кода.Ответы:
См. Этот пример:
$.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). } });
источник
.complete()
устарело; использовать.always()
сейчас. api.jquery.com/jQuery.ajax.always()
должно сработать. См . Раздел «Объект jqXHR » на http://api.jquery.com/jQuery.ajax/ .См. Также http://api.jquery.com/deferred.always/
источник
Приведенные ниже предложения не будут работать в 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"); });
источник
then
не обнаруживает ошибок в обратном вызове. Ли вы попробовать это?Замечание для тех, кто использует jQuery 3.0 и новее
Как в официальной документации
источник
Есть ошибка, в которой 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"); } } });
Извините, плохой английский! Ура ;-)
источник
если вам нужно одно определение кода для всех запросов ajax, вы можете сделать это так
$(document).ajaxComplete(function () { console.log('ajax complete on doc'); })
источник