Jquery Ajax 오류 처리가 중단됨을 무시합니다.


81

ajax 호출에 대한 전역 오류 처리 방법을 갖고 싶습니다.

$.ajaxSetup({
  error: function (XMLHttpRequest, textStatus, errorThrown) {
    displayError();
  }
});

의 오류를 무시해야합니다 aborted. errorThrown은 null이고 textStatus입니다 error. 어떻게 확인 aborted합니까?


4
나를 위해 textStatus는 "중단"입니다. 나는 이것이 오래된 질문이라고 생각합니다-아마도 변경되었을 수 있습니다.
jackocnr 2013-09-05

나에게는 여전히 "오류"입니다.
Jānis Elmeris

예, 슬프게도 브라우저에 따라 다릅니다.
Christophe Roussy


1
abort수동으로 호출하는 경우 (그리고 언제 호출 될지 잘 모르겠 음) 오류 메시지를 전달할 수 있습니다 abort("abort")..
MyiEye

답변:


52

오늘도 동일한 사용 사례를 다루어야했습니다. 내가 작업중인 앱에는 1) 사용자가 멀리 이동하거나 2) 일종의 일시적인 연결 / 서버 오류로 인해 중단 될 수있는 이러한 장기 실행 아약스 호출이 있습니다. 오류 처리기가 연결 / 서버 실패에 대해서만 실행되고 사용자가 멀리 이동하지 않기를 원합니다.

먼저 Alastair Pitts의 답변을 시도했지만 중단 된 요청과 연결 실패 모두 상태 코드와 readyState를 0으로 설정했기 때문에 작동하지 않았습니다. 다음으로 sieppl의 답변을 시도했습니다. 두 경우 모두 응답이 없으므로 헤더가 없기 때문에 작동하지 않았습니다.

나를 위해 일한 유일한 해결책은 페이지가 언로드되었음을 나타내는 전역 변수를 설정하는 window.onbeforeunload에 대한 리스너를 설정하는 것입니다. 그런 다음 오류 처리기는 페이지가 언로드되지 않은 경우에만 오류 처리기를 확인하고 호출 할 수 있습니다.

var globalVars = {unloaded:false};
$(window).bind('beforeunload', function(){
    globalVars.unloaded = true;
});
...
$.ajax({
    error: function(jqXHR,status,error){
        if (globalVars.unloaded)
            return;
    }
});

4
자바 스크립트에 의해 ajax 요청이 중단되면 작동하지 않습니다
Sano J

1
이것은 유효한 대답이 아닙니다. 언로드 전에 언로드를 취소 할 수 있습니다. 이 경우 모든 후속 Ajax 오류가 무시됩니다.
LOST

@LOST beforeunload핸들러는 사용자 정의입니다. true같은 방법으로 언로드를 취소 하려는 경우 globalVars.unloaded를로 설정하는 이유는 무엇 입니까?
bluecollarcoder

@bluecollarcoder 내가 말하는 것은 큰 프로젝트가있는 경우이 문제에 직면 한 경우 모든 처리기를 언로드하기 전에 해결해야하며 제공 한 새 프로젝트를 추가하는 것만으로는 충분하지 않습니다.
LOST

beforeunload사용자가 다른 페이지로 이동할 때 호출되지 않거나 너무 늦게 호출됩니까?
Christophe Roussy

43

최신 jQuery에서는 다음 request.statusText과 같은지 확인할 수 있습니다 'abort'.

error: function (request, textStatus, errorThrown) {
    if (request.statusText =='abort') {
        return;
    }
}

4
크롬에서 "중단"을 확인할 수 있습니다. 파이어 폭스에서는 "오류"가 발생합니다. @bluecollarcoder의 솔루션이 우리에게 가장 좋은 것 같습니다.
foxontherock

예이 다릅니다 (... 일반적인 웹 문제) 브라우저에 따라
크리스토프 후씨

21

내가 찾은 것은 중단 된 요청이있을 때 statusand / or readyStateequal 0.

내 전역 오류 처리기에서 메서드 맨 위에 확인이 있습니다.

$(document).ajaxError(function (e, jqXHR, ajaxSettings, thrownError) {
    //If either of these are true, then it's not a true error and we don't care
    if (jqXHR.status === 0 || jqXHR.readyState === 0) {
        return;
    }

    //Do Stuff Here
});

나는 이것이 나를 위해 완벽하게 작동한다는 것을 알았습니다. 이것이 당신이나 이것에 부딪히는 다른 사람에게 도움이되기를 바랍니다 :)


3
ajax가 서버에 연결할 수없는 경우 동일한 상태와 readyState를 얻습니다. 그러나 이것은 내가 처리하고 싶은 오류입니다. 중단되지 않았습니다.
Mitar

예,보고 싶은 다른 오류를 숨 깁니다.
Christophe Roussy

10

오류 함수에 전달 된 textStatus 인수를보고 싶을 것입니다. http://api.jquery.com/jQuery.ajax/ 에 따르면 "success", "notmodified", "error", "timeout", "abort"또는 "parsererror"값을 사용할 수 있습니다. "중단"은 분명히 확인하려는 것입니다.

여기에 더 긴 메모 : jquery-gotcha-error-callback-triggered-on-xhr-abort


나는 우리가 이것을 가지고 놀았고 우리가 가진 일종의 중단 오류 메시지를 감지하지 못했다고 생각합니다.
sieppl

5

bluecollarcoders 응답은 자바 스크립트에 의해 중단 된 ajax 요청에 대해 작동하지 않기 때문에 다음은 내 솔루션입니다.

var unloaded = false;
...
$(window).bind('beforeunload', function(){
    unloaded = true;
});


$(document).ajaxError(function(event, request, settings) {
    if (unloaded || request.statusText == "abort") {
        return;
    }
    ...
}

예 :

handler = jQuery.get("foo")
handler.abort()

이제 ajaxError 핸들러에서 무시됩니다.


3

에 구축 알라 Pitts'a 응답 , 당신은 또한 더 많은 정보를 메시지가이 작업을 수행 할 수 있습니다 :

$(document).ajaxError(function (e, jqXHR, ajaxSettings, thrownError)
{
    {
        if (jqXHR.status === 0)
        {
            alert('Not connect.\n Verify Network.');
        } else if (jqXHR.status == 404)
        {
            alert('Requested page not found. [404]');
        } else if (jqXHR.status == 500)
        {
            alert('Internal Server Error [500].');
        } else if (exception === 'parsererror')
        {
            alert('Requested JSON parse failed.');
        } else if (exception === 'timeout')
        {
            alert('Time out error.');
        } else if (exception === 'abort')
        {
            alert('Ajax request aborted.');
        } else
        {
            alert('Uncaught Error.\n' + jqXHR.responseText);
        }
    }
});

2
$(document).ajaxError(function(event, jqXHR, ajaxSettings, thrownError) {

    if (!jqXHR.getAllResponseHeaders()) {
        return;
    }           
}); 

1
또한 도움이되지 않습니다. 중단 된 요청과 서버에 대한 연결 오류 모두에 대해 응답 헤더가 비어 있습니다.
Clovis Six

@ClovisSix 예, 위의 솔루션은 응답 헤더가 비어 있는지 확인하고 짜증나는 오류 메시지를 억제합니다. 우리가 운영하는 여러 상용 시스템에서 잘 작동합니다. 달성하려는 노력 / 문제가 무엇인지 자세히 설명해 주시겠습니까?
sieppl

요청이 서버에 연결할 수없는 경우 메시지를 표시합니다. 수동 중단에 대해서는 표시하지 않지만 가장 큰 문제는 사용자가 다음 페이지로 이동했을 때 연결 오류가 발생하여 중단 된 요청과 연결 오류를 구분할 방법이 없었습니다. window.onbeforeunload에 var를 설정하여 문제를 해결했습니다. 수동 중단을 거의 감지합니다.
Clovis Six

또한 여기에 더 세부 사항 : ilikestuffblog.com/2009/11/30/...
크리스토프 후씨

0

나는 여기에 동일한 문제가 있었고 해결책으로 내가 한 것은 아래와 같이 abort () 호출 직전에 "중단"var를 설정하는 것이었다.

aborting = true;
myAjax.abort();

abort가 참이 아닌 경우 ajax 요청의 오류 처리기에서만 오류를 표시합니다.

$.ajax({
    [..]
    error: function() {
        if ( !aborting ) {
            // do some stuff..
        }
        aborting = false;
    }
});

0

ajax 요청을 수동으로 중단하면 다음과 같이 할 수 있습니다.

var xhr;
function queryData () {
    if (xhr) {
      // tag it's been aborted
      xhr.hasAborted = true;

      // manually canceled request
      xhr.abort();
    }

    xhr = $.ajax({
        url: '...',
        error: function () {
            if (!xhr.hasAborted) {
                console.log('Internal Server Error!');
            }
        },
        complete: function () {
           xhr = null;
        }
    });
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.