ajax 호출에 대한 전역 오류 처리 방법을 갖고 싶습니다.
$.ajaxSetup({
error: function (XMLHttpRequest, textStatus, errorThrown) {
displayError();
}
});
의 오류를 무시해야합니다 aborted
. errorThrown
은 null이고 textStatus
입니다 error
. 어떻게 확인 aborted
합니까?
ajax 호출에 대한 전역 오류 처리 방법을 갖고 싶습니다.
$.ajaxSetup({
error: function (XMLHttpRequest, textStatus, errorThrown) {
displayError();
}
});
의 오류를 무시해야합니다 aborted
. errorThrown
은 null이고 textStatus
입니다 error
. 어떻게 확인 aborted
합니까?
abort
수동으로 호출하는 경우 (그리고 언제 호출 될지 잘 모르겠 음) 오류 메시지를 전달할 수 있습니다 abort("abort")
..
답변:
오늘도 동일한 사용 사례를 다루어야했습니다. 내가 작업중인 앱에는 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;
}
});
beforeunload
핸들러는 사용자 정의입니다. true
같은 방법으로 언로드를 취소 하려는 경우 globalVars.unloaded를로 설정하는 이유는 무엇 입니까?
beforeunload
사용자가 다른 페이지로 이동할 때 호출되지 않거나 너무 늦게 호출됩니까?
최신 jQuery에서는 다음 request.statusText
과 같은지 확인할 수 있습니다 'abort'
.
error: function (request, textStatus, errorThrown) {
if (request.statusText =='abort') {
return;
}
}
내가 찾은 것은 중단 된 요청이있을 때 status
and / or readyState
equal 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", "notmodified", "error", "timeout", "abort"또는 "parsererror"값을 사용할 수 있습니다. "중단"은 분명히 확인하려는 것입니다.
여기에 더 긴 메모 : jquery-gotcha-error-callback-triggered-on-xhr-abort
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 핸들러에서 무시됩니다.
에 구축 알라 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);
}
}
});
$(document).ajaxError(function(event, jqXHR, ajaxSettings, thrownError) {
if (!jqXHR.getAllResponseHeaders()) {
return;
}
});
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;
}
});
}