무시하기 위한 Jquery Ajax 오류 처리 중단됨
ajax 콜에 대한 글로벌 오류 처리 방식을 사용하고 싶은데, 이 방법은 다음과 같습니다.
$.ajaxSetup({
error: function (XMLHttpRequest, textStatus, errorThrown) {
displayError();
}
});
의 오류를 무시할 필요가 있습니다.aborted.errorThrown무효입니다.textStatus이error확인 방법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
'programing' 카테고리의 다른 글
| tsc가 로컬파일에 대해 TS2307: Cannot find module을 슬로우합니다. (0) | 2023.03.27 |
|---|---|
| WordPress 함수에서 여러 Google 글꼴을 큐에 넣을 수 없는 이유는 무엇입니까? (0) | 2023.03.27 |
| Oracle 테이블/컬럼/인덱스 이름이 30자로 제한되는 이유는 무엇입니까? (0) | 2023.03.27 |
| javascript에서 jQuery Mobile Dialog를 여는 방법 (0) | 2023.03.27 |
| TypeError: 정의되지 않은 것은 반복할 수 없습니다(속성 기호(Symbol.iterator)를 읽을 수 없습니다). (0) | 2023.03.27 |