jQuery AJAX 호출에 '최종'과 유사한 것이 있습니까?


84

jQuery AJAX 호출에 Java '마지막'아날로그가 있습니까? 여기에이 코드가 있습니다. 내 항상 예외를 던지지 만 항상 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/


만에 다시 추가 always...
데이비드 Fregoli

1
당신은 당신이 찾고있는 오류를 비동기 적으로 던질 수 없습니다. 당신은 그것을 try-catch-finally성명서에 직접 포장해야합니다 .
Bergi

3
그것은 항상 이 이렇게 적절하게 이름을 왜 그건, 항상 () 함수로 이동합니다.
adeneo

jQuery가 콜백의 모든 try / catch를 처리하지 않으면 throw "something";코드 실행이 중지됩니다.
plalx 2013-04-10

@Bergi, jQuery의 promises impl에 익숙하지 않지만 Promises / A +를 준수하는 경우 throw 된 오류는 그때 전달 된 errorHandler에 전달됩니다. 따라서 두 번째 함수를 전달하면 매개 변수로 "무언가"를받습니다.
David McMullin 2013

답변:


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 매개 변수는 더 이상 사용되지 않습니다. 이제 jqXHR 객체가 Promise 인터페이스를 구현하므로 .complete () 콜백 만 사용하지 않습니다. 이 질문에 대한 답변보기 : stackoverflow.com/questions/15821141/…
jeanie77

45

.always()작동해야합니다. http://api.jquery.com/jQuery.ajax/The jqXHR Object 섹션을 참조하십시오 .

jqXHR.always (function (data | jqXHR, textStatus, jqXHR | errorThrown) {}); 완전한 콜백 옵션에 대한 대체 구조 인 .always () 메서드는 더 이상 사용되지 않는 .complete () 메서드를 대체합니다.

성공적인 요청에 대한 응답으로 함수의 인수는 .done ()의 인수와 동일합니다 : data, textStatus 및 jqXHR 객체. 실패한 요청의 경우 인수는 jqXHR 객체, textStatus 및 errorThrown과 같은 .fail ()의 인수와 동일합니다. 구현 세부 사항은 deferred.always ()를 참조하십시오.

http://api.jquery.com/deferred.always/참조 하십시오.


11

아래 제안은 jQuery에서 작동하지 않습니다. jQuery의 promise 구현은 그때 전달 된 메서드에서 발생한 오류를 처리하지 않기 때문입니다. jQuery가 promises / A +를 준수하는 경우 가능할 수있는 일에 대한 설명으로 여기에 남겨 두겠습니다. Bergi가 올바르게 지적했듯이 코드를 직접 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");
});

jQuery then는 콜백에서 오류를 포착하지 않습니다. 나요 당신 이 시도?
Bergi

죄송합니다. 그때-> 항상 사용해 보았습니다. 당시에는 두 가지 기능을 사용했지만 여전히 같은 문제가 있습니다.
Oliver Watkins 2013

진심으로 사과드립니다. jquery의 지연된 문서를 살펴본 후 이것이 효과가있을 것이라고 생각했지만 분명히 착각했으며 Bergi는 내가 샌드 박스를 확인해야한다고 올바르게 지적했습니다.
David McMullin 2013

3

jQuery 3.0 이상을 사용하는 사람들을위한 참고 사항

사용 중단 알림 : jqXHR.success (), jqXHR.error () 및 jqXHR.complete () 콜백은 jQuery 3.0부터 제거되었습니다. 대신 jqXHR.done (), jqXHR.fail () 및 jqXHR.always ()를 사용할 수 있습니다.

공식 문서에서와 같이


2

Ajax가 서버에 의존하는 버그가 있으며, 상태를 확인해야하는 경우 "완료"가 최고, 일종의 "성공", "오류"및 기타가 PUT, POST 및 GET의 100 %가 아닙니다. 예를 들어

$.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');
})
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.