¿Por qué mi función está volviendo indefinida?

La función validate () devuelve indefinido, cuando esperaba que devolviera false o true. ¿Por qué está pasando esto? Ahora solo escribo esto porque stackoverflow no me permite publicar esta pregunta, ya que es principalmente código.

function validate() { var isFormValid = false; var emailValid = false; var inputValid = false; var passValid = true; //VALIDATE EMAIL var emailInput = $("input[type='email']"); $.get("/checkEmail", { email: emailInput.val() }, function(data) { if (data.userExists) { emailInput.removeClass("valid"); emailInput.addClass("invalid"); return false; } else { emailValid = true; emailInput.removeClass("invalid"); emailInput.addClass("valid"); } if (passValid && emailValid && inputValid) { return true; } }); //ADD VALID CLASS TO INPUTS var inputs = $("input,textarea"); inputs.each(function() { if ($(this).val() != "") { inputValid = true; $(this).removeClass("invalid"); $(this).addClass("valid"); } else { $(this).removeClass("valid"); $(this).addClass("invalid"); return false; } if (passValid && emailValid && inputValid) { return true; } }); //VADIDATE PASSWORD var pass = $("input[name='password']"); var repass = $("input[name='repassword']"); if (pass.val() != repass.val()) { passValid = false; repass.removeClass("valid"); repass.addClass("invalid"); return false; } } $(document).ready(function() { $("#registerForm").submit(function(event) { console.log(validate()); if (!validate()) { event.preventDefault(); } }); }); 

Devuelve $.get() desde validate ; devuelva true o false en .then() encadenado a $.get() call; use .then() , .fail() at .submit() call para procesar el valor de promesa devuelto por .then() at validate

 function validate() { var isFormValid = false; var emailValid = false; var inputValid = false; var passValid = true; //VALIDATE EMAIL var emailInput = $("input[type='email']"); // note `return` return $.get("/checkEmail", { email: emailInput.val() }) .then(function(data) { // perform all necessary logic, return `true` or `false` within `.then()` if (data.userExists) { emailInput.removeClass("valid"); emailInput.addClass("invalid"); return false; } else { emailValid = true; emailInput.removeClass("invalid"); emailInput.addClass("valid"); } if (passValid && emailValid && inputValid) { return true; } /* // if below logic is necessary, perform logic within `.then()` //ADD VALID CLASS TO INPUTS var inputs = $("input,textarea"); inputs.each(function() { if ($(this).val() != "") { inputValid = true; $(this).removeClass("invalid"); $(this).addClass("valid"); } else { $(this).removeClass("valid"); $(this).addClass("invalid"); return false; } if (passValid && emailValid && inputValid) { return true; } }); //VADIDATE PASSWORD var pass = $("input[name='password']"); var repass = $("input[name='repassword']"); if (pass.val() != repass.val()) { passValid = false; repass.removeClass("valid"); repass.addClass("invalid"); return false; } */ }); } $(document).ready(function() { $("#registerForm").submit(function(event) { event.preventDefault(); var elem = event.currentTarget; validate() .then(function(bool) { // if `bool` is `true` call `.submit()` if (bool) { elem.submit() } }) // handle error .fail(function(jqxhr, textStatus, errorThrown) { console.log(errorThrown) }) }); });