2016-12-25 4 views
1

Im folgenden Code funktioniert der Ajax-Aufruf und isTaken wird ordnungsgemäß aktualisiert. Aber return isTaken wird ausgeführt, bevor der Ajax-Aufruf abgeschlossen ist, so dass immer die ursprüngliche false Einstellung zurückgegeben wird. async = true ist veraltet, wie kann ich warten, bis der Ajax-Aufruf fertig ist, bevor eine korrekt aktualisierte Antwort isTaken zurückgegeben wird?jquery validator mit AJAX-Timing-Problem

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

prüfen diese : https://jqueryvalidation.org/remote-method/ –

Antwort

0

Verwenden jQuery.when() für diese, die für die übergebene AJAX wartet ruft vor Abschluss der Callback-Funktion zu beenden.

$.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." 
    ); 

Ich habe auch Ihren Code ein wenig vereinfacht, indem Sie den Booleschen Wert zurückkehrt nach dem if-Anweisung Sie hatten.

Ich würde diesen AJAX-Aufruf von Ihrer Funktion erhalten und es zu einem separaten machen - auf diese Weise wird der Code besser aussehen und der Anruf kann von einem anderen Ort aus erfolgen.

$.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 
    }); 
} 

Darüber hinaus würden Sie wollen, auch Fehler in der AJAX-Aufruf zu handhaben, verwenden then statt done und zwei Funktionen als Rückrufe bieten: eine für den Erfolg, und ein für das Scheitern:

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

Danke Siavas, das ist was ich brauchte. Perfekt! – dru37

Verwandte Themen