2017-12-08 80 views
0

등록을 할 때 전자 메일 주소가 이미 계정과 연결되어 있는지 즉시 확인하고 싶습니다. 따라서 jQuery 유효성 검사 플러그인을 사용하고 서버에 동기식 ajax 요청을 보냅니다. 그건 잘 작동합니다.
시간 제한이 발생할 경우 어떻게되는지 테스트하기 위해 Ajax 요청에 대해 5ms의 시간 제한을 선택했습니다. 서버 측 (PHP 파일)에서 프로그램 실행은 sleep (5)를 사용하여 5 초 지연됩니다.
그러나 5ms 후에 시간 초과 오류가 발생하는 대신 성공 콜백은 5 초 후에 서버에서 올바른 데이터를 반환합니다.
따라서 ajax timeout 매개 변수가 작동하지 않는 것 같습니다. 이 내 코드입니다 : 내가 다른 기사 코드를 여러 번 확인했지만 어떤 문제가 있는지 알 수 없습니다jQuery : 'timeout'오류가 발생하지 않았습니다. 오류 콜백이 실행되지 않습니다.

$.validator.addMethod('ist_ProvEmail_noch_frei',function(value, element) { 
    var bValidEmail; 

    var jqXHR = $.ajax({ 
     url: 'ajax/IstProvEmailVergeben.php', 
     data: { 
      email: value 
     }, 
     success : function(data, textStatus, jqXHR) { 
      console.log("success1: " + textStatus); 
     // some code 
     }, 
     error : function(jqXHR, textStatus, errorThrown) { 
      console.log("textStatus1: " + textStatus + ", type: " + typeof textStatus); 
     // some code 
      bValidEmail = true; // to prevent jQueryValidation from showing an error message 
     }, 

     method: "POST", 
     async: false, 
     timeout: 5,   // 5 ms 
     dataType: 'json' 
    }); 

    console.log("jqXHR.responseText: " + jqXHR.responseText); 
    return bValidEmail; 
}, 'This email address is already associated with an account.'); 

.
아무도 아이디어가 있습니까? 헨리

+1

가 타임 아웃'비동기 작동하지 않습니다 생각 만 수 : FALSE ', 그것은 문서화 된 기능은 아니지만. 'async : true'를 시도하십시오. –

+0

어쨌든 항상 'async : true'를 사용해야합니다. –

+0

async : false를 사용해야합니다. 그렇지 않으면 jQueryValidate 플러그인이 올바른 답을 얻지 못합니다. 즉, bValidEmail은 서버에서 오는 정보에 의존합니다. 비동기 요청은 bValidEmail을 정의되지 않은 것으로 반환합니다. – Henry

답변

1

async: false

가 문제입니다. 비동기 호출 여기를 참조하십시오 : 거짓 : 비동기와

$.ajax({ 
 
    url: "/ajax_json_echo/", 
 
    type: "GET", 
 
    dataType: "json", 
 
    timeout: 5, 
 
    success: function(response) { alert("success"); }, 
 
    error: function(xmlhttprequest, textstatus, message) { 
 
     if(textstatus==="timeout") { 
 
      alert("got timeout"); 
 
     } else { 
 
      alert(textstatus); 
 
     } 
 
    } 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

그리고 여기를

$.ajax({ 
 
    url: "/ajax_json_echo/", 
 
    type: "GET", 
 
    dataType: "json", 
 
    timeout: 5, 
 
    async: false, 
 
    success: function(response) { alert("success"); }, 
 
    error: function(x, t, m) { 
 
     if(t==="timeout") { 
 
      alert("got timeout"); 
 
     } else { 
 
      console.log(t); 
 
     } 
 
    } 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

이유 : 동기 아약스 요청시, 브라우저가 차단되고 자바 스크립트를 실행할 수 없습니다. 브라우저가 차단되었습니다.

편집 : 제한 시간과 동기 요청을 사용하기위한 해결 방법 : https://stackoverflow.com/a/36008375/1670090

$.ajax({ 
 
    url : '/ajax_json_echo/', 
 
    type: 'GET', 
 
    timeout: 5, 
 
    dataType : 'json', 
 
    success : function(data, textStatus) { 
 
     $.ajax({ 
 
      url : '/ajax_json_echo/', 
 
      async: false, 
 
      type: 'GET', 
 
      dataType : 'json', 
 
      success: function(response) { alert("success"); }, 
 
      error: function(xmlhttprequest, textstatus, message) { 
 
       if(textstatus==="timeout") { 
 
        alert("got timeout"); 
 
       } else { 
 
        alert(textstatus); 
 
       } 
 
      } 
 
     }); 
 
    }, 
 
    error : function(jqhdr, textstatus, 
 
        errorThrown) { 
 
     if(textstatus==="timeout") { 
 
      alert("got timeout"); 
 
     } else { 
 
      alert(textstatus); 
 
     } 
 
    } 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

+0

"해결 방법"은 답변 내에서 완전히 철자해야합니다. 대답으로 다른 SO 응답에 대한 링크를 게시해서는 안됩니다. – Sparky

+0

Thanks @ Sparky, OP 질문과 관련된 코드를 추가했습니다. –