programing

무시하기 위한 Jquery Ajax 오류 처리 중단됨

mbctv 2023. 3. 27. 21:31
반응형

무시하기 위한 Jquery Ajax 오류 처리 중단됨

ajax 콜에 대한 글로벌 오류 처리 방식을 사용하고 싶은데, 이 방법은 다음과 같습니다.

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

의 오류를 무시할 필요가 있습니다.aborted.errorThrown무효입니다.textStatuserror확인 방법aborted?

오늘도 같은 사용 사례를 처리해야 했습니다.현재 작업 중인 앱에는 1) 사용자가 다른 곳으로 이동하거나 2) 일종의 일시적인 연결/서버 장애에 의해 중단될 수 있는 장기 실행 중인 Ajax 콜이 있습니다.에러 핸들러는 접속/서버 장애에 대해서만 실행되도록 하고, 유저가 네비게이트 하는 경우는 실행하지 않게 해 주세요.

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

유일한 해결책은 window.onbeforeunload의 리스너를 설정하는 것입니다.이것에 의해, 페이지가 언로드 된 것을 나타내는 글로벌 변수가 설정됩니다.에러 핸들러는 페이지가 언로드되지 않은 경우에만 에러 핸들러를 체크하고 호출할 수 있습니다.

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

modern jQuery에서는 다음과 같은 내용을 확인할 수 있습니다.request.statusText와 동등하다'abort':

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

제가 발견한 것은 중단된 요청이 있을 때status및/또는readyState동등.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
});

난 이게 나한테 딱 맞는다는 걸 알았어.이것이 귀하 또는 이와 관련된 다른 모든 사람에게 도움이 되기를 바랍니다.

오류 함수에 전달된 textStatus 인수를 확인해야 합니다.http://api.jquery.com/jQuery.ajax/,에 따르면 "success", "not modified", "error", "success", "success", "not modified", "error" 등의 값을 사용할 수 있습니다.'불안함'은 분명히 당신이 확인하고 싶은 것입니다.

자세한 내용은 jquery-gotcha-error-callback-triggered-on-xhr-abort를 참조하십시오.

javascript에 의해 중단된 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 핸들러에 의해 무시됩니다.

Alastair Pitts의 답변을 바탕으로 다음과 같은 정보를 얻을 수 있습니다.

$(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);
        }
    }
});
$(document).ajaxError(function(event, jqXHR, ajaxSettings, thrownError) {

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

여기서도 같은 문제가 발생했습니다.해결책으로서 실행한 것은 다음과 같이 abort() 호출 직전에 "aborting" var를 설정하는 것입니다.

aborting = true;
myAjax.abort();

abort가 true가 아닌 경우에만 agax 요청 오류 핸들러에 오류가 표시됩니다.

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

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;
        }
    });
}

언급URL : https://stackoverflow.com/questions/4807572/jquery-ajax-error-handling-to-ignore-aborted

반응형