아약스에 대한 시간 초과 설정 (jQuery)


195
$.ajax({
    url: "test.html",
    error: function(){
        //do something
    },
    success: function(){
        //do something
    }
});

때로는 success기능이 제대로 작동하지만 때로는 그렇지 않습니다.

이 아약스 요청에 대한 시간 초과를 어떻게 설정합니까? 예를 들어 시간이 초과되면 3 초 후에 오류가 표시됩니다.

문제는 ajax 요청이 완료 될 때까지 블록을 정지한다는 것입니다. 서버가 잠시 다운되면 종료되지 않습니다.


2
,다음에 가 있어야 합니다 }.
pimvdb


답변:


329

$.ajax 설명서를 읽으십시오 .이 주제는 다루어집니다.

$.ajax({
    url: "test.html",
    error: function(){
        // will fire when timeout is reached
    },
    success: function(){
        //do something
    },
    timeout: 3000 // sets timeout to 3 seconds
});

error: function(jqXHR, textStatus, errorThrown)옵션 의 textStatus 매개 변수에 액세스하여 어떤 유형의 오류가 발생했는지 확인할 수 있습니다 . 옵션은 "timeout", "error", "abort"및 "parsererror"입니다.


4
시간 초과 오류 잡기와 관련하여 stackoverflow.com/questions/3543683/…
Adrien Be

1
그냥 나를 위해 작동하지 않는 것, 타임 아웃 : 1, 그것이 통과되고 있음을 확인하고, 결코 시간을 초과하지 않습니다.
PandaWood

try / catch로 전체 $ .ajax 호출을 래핑해야합니다. 중단은 jQuery에 걸리지 않으며 $ .ajax 호출 외부에서 발생합니다.
justdan23

112

다음은 jQuery의 이전 및 새로운 패러다임에서 시간 초과 설정 및 감지를 보여주는 몇 가지 예입니다.

Live Demo

jQuery 1.8 이상으로 약속

Promise.resolve(
  $.ajax({
    url: '/getData',
    timeout:3000 //3 second timeout
  })
).then(function(){
  //do something
}).catch(function(e) {
  if(e.statusText == 'timeout')
  {     
    alert('Native Promise: Failed from timeout'); 
    //do something. Try again perhaps?
  }
});

jQuery 1.8 이상

$.ajax({
    url: '/getData',
    timeout:3000 //3 second timeout
}).done(function(){
    //do something
}).fail(function(jqXHR, textStatus){
    if(textStatus === 'timeout')
    {     
        alert('Failed from timeout'); 
        //do something. Try again perhaps?
    }
});​

jQuery <= 1.7.2

$.ajax({
    url: '/getData',
    error: function(jqXHR, textStatus){
        if(textStatus === 'timeout')
        {     
             alert('Failed from timeout');         
            //do something. Try again perhaps?
        }
    },
    success: function(){
        //do something
    },
    timeout:3000 //3 second timeout
});

것을 알 수 textStatus의 PARAM (또는 jqXHR.statusText가 ) 오류가 무엇인지 알려줍니다. 실패가 시간 초과로 인해 발생한 것을 알고 싶은 경우에 유용 할 수 있습니다.

오류 (jqXHR, textStatus, errorThrown)

요청이 실패하면 호출 할 함수입니다. 이 함수는 jqXHR (jQuery 1.4.x에서 XMLHttpRequest) 오브젝트, 발생한 오류 유형을 설명하는 문자열 및 발생하는 경우 선택적 예외 오브젝트를 수신합니다. 두 번째 인수 (널 제외)에 가능한 값은 "timeout", "error", "abort"및 "parsererror"입니다. HTTP 오류가 발생하면 errorThrown은 "Not Found"또는 "Internal Server Error"와 같은 HTTP 상태의 텍스트 부분을 수신합니다. jQuery 1.5부터는 오류 설정에 여러 함수를 사용할 수 있습니다. 각 기능이 차례로 호출됩니다. 참고 :이 핸들러는 도메인 간 스크립트 및 JSONP 요청에 대해 호출되지 않습니다.

src : http://api.jquery.com/jQuery.ajax/


차이 무엇 $.ajax().fail()$.ajax().error()?
Alejandro García Iglesias

1

3
jQuery 1.8 이상을 포함하면 +1입니다. 유사한 질문에 대한 대부분의 다른 답변에는 <의 성공 / 오류 만 포함됩니다.
brandonscript

22

다음 timeout과 같이 ajax 옵션에서 설정을 사용할 수 있습니다 .

$.ajax({
    url: "test.html",
    timeout: 3000,
    error: function(){
        //do something
    },
    success: function(){
        //do something
    }
});

http://api.jquery.com/jQuery.ajax/ 에서 아약스 옵션에 대한 모든 내용을 읽으십시오.

시간 초과가 발생하면 error핸들러가 아닌 핸들러가 트리거됩니다. success:)


2

모든 기능을 갖춘 .ajaxjQuery 함수를 사용하십시오 . 예 를 보려면 https://stackoverflow.com/a/3543713/1689451 과 비교 하십시오 .

테스트하지 않고 참조 된 SO 질문과 코드를 병합하면됩니다.

target = $(this).attr('data-target');

$.ajax({
    url: $(this).attr('href'),
    type: "GET",
    timeout: 2000,
    success: function(response) { $(target).modal({
        show: true
    }); },
    error: function(x, t, m) {
        if(t==="timeout") {
            alert("got timeout");
        } else {
            alert(t);
        }
    }
});​

H-Bahrami와 루돌프 물 바우어 답장을 보내 주셔서 감사하지만 난 그렇게 내 코드를 통해 명확히하십시오 아약스의 새로운 오전 ... 난 이미이 답을 볼 수 있기 때문에하지만 난 도움을 나를 기쁘게 on..so 무슨 모르는 ...

.load () 통해 어떻게 할 수 있습니까? 가능합니까?

@ SS, load : api.jquery.com/load 문서에서 시간 초과를 찾으십시오 . 내 코드에 오타가 수정되었습니다.
Rudolf Mühlbauer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.