2017-12-08 23 views
0

登録を行う際に、メールアドレスが既にアカウントに関連付けられているかどうかをすぐに確認したいと思います。 したがって、jQuery検証プラグインを使用して、サーバーに同期ajaxリクエストを送信します。それはうまく動作します。
タイムアウトの場合に何が起こるかをテストするために、私はajaxリクエストに対して5msのタイムアウトを選択しました。サーバー側(php-file)では、プログラムの実行がsleep(5)を使って5秒遅れます。
5ms後にタイムアウトエラーが発生する代わりに、成功コールバックは5秒後にサーバーから正しいデータを返します。
したがって、ajax timeoutパラメータが機能していないようです。 これは私のコードです:jQuery: 'タイムアウト'エラーが表示されません。エラーコールバックが起動しません。

$.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>

理由:非同期呼び出しでここを参照してください同期AJAX要求時に、ブラウザがブロックされ、javascriptは実行できません。wブラウザがブロックされます。

編集:タイムアウトと同期要求を使用するための回避策: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質問に関連するコードを追加しました。 –

関連する問題