2016-12-25 13 views
1

次のコードでは、ajax呼び出しが機能し、isTakenが正しく更新されます。しかし、return isTakenはajax呼び出しが完了する前に実行されるので、常に初期のfalse設定を返します。 async = trueは非推奨ですので、正しく更新されたisTaken応答を返す前に、ajax呼び出しが完了するのを待つ方法はありますか?渡されたAJAXを待ちajaxタイミングの問題を伴うjqueryバリデータ

$.validator.addMethod("checkExists", 
     function (value, element) { 

      var email = $("#email").val(); 
      var data = {email: email}; 

      var isTaken = false; 
      $.ajax({ 
       type: "POST", 
       url: "http://localhost/CFBserver/check_email.php", 
       data: data, 
       success: function (response) { 
        isTaken = (response == 1) ? true : false; 
       } 
      }); 
      return isTaken; 
     }, 
     "This username is already taken! Try another." 
     ); 
+0

チェックこれを

さらに
$.when(checkMail).done(function(response) { return response == 1; // returns true is response is 1, false otherwise }); // Outside of validator function... function checkMail() { return $.ajax({ type: "POST", url: "http://localhost/CFBserver/check_email.php", data: data }); } 

は、あなたも、あなたのAJAX呼び出しでエラーを処理する代わりにdonethenを使用し、2つのコールバックなどの機能を提供したいと思います:https://jqueryvalidation.org/remote-method/ –

答えて

0

このため使用jQuery.when()は、コールバック関数を完了する前に終了して呼び出します。

$.validator.addMethod("checkExists", 
    function (value, element) { 

     var email = $("#email").val(); 
     var data = {email: email}; 

     $.when(
      return $.ajax({ 
       type: "POST", 
       url: "http://localhost/CFBserver/check_email.php", 
       data: data 
      }); 
     ).done(function(response) { 
      return response == 1; // returns true is response is 1, false otherwise 
     }); 
    }, 
    "This username is already taken! Try another." 
    ); 

また、あなたが持っていたifステートメントに従ってブール値を返すことで、コードを少し簡略化しました。

私はあなたの関数からこのAJAX呼び出しを取得し、それを別のものにします。コードが良く見えるように、別の場所から呼び出すことができます。成功のための1、および障害の1:

$.when(checkMail).then(function(response) { 
    // Function gets called as 'success' from AJAX 
    return response == 1; 
}, function (errorResponse) { 
    // Function gets called as 'error' from AJAX 
    // return false; // or 
    // return "Error when checking email: " + errorResponse; 
}); 
+0

ありがとうSiavas、これは私が必要なものです。完璧! – dru37

関連する問題