My apologies for the one millionth iteration of this type of question. I've already seen a number of other posts talking about this, and I still can't wrap my head around being able to invoke a function after the callback is successful and returns. I must have read this post over half a dozen times:
How do I return the response from an asynchronous call?
The Code
Anyway .., my question I hope anyone could shed some light on. I have a custom jQuery validator method that checks if a username is available.
jQuery.validator.addMethod("usernameAvailability", 
        function(value, element) {
            console.log('starting usernameAvailability');
            if(this.optional(element) === true){return true;}
            else{
                 console.log('ending usernameAvailability, about to return get_availability');
                 return availabilityCheck.get_availability('username');
            }
        }, "Username already in use." );
The custom jQuery validator method calls get_availability(element) in namespace availabilityCheck.
var availabilityCheck = (function() {
        var usernameIsAvailable, emailIsAvailable, Callback, AJAX_Availability_Check, change_Availability;
        usernameIsAvailable = null;
        emailIsAvailable = null;
        AJAX_Availability_Check = function(callback, element){
                console.log('starting AJAX_Availability_Check');
                if(element==="username"){
                    selection = {username:$('#id_username').val()};
                }
                else{
                    selection = {email:$('#id_email').val()};
                }
                $.ajax({
                    url: '/register/',
                    type: 'get',
                    data: selection,
                    dataType:'text',
                    async: true
                    }).done(Callback(element));
            };
        change_Availability = function(element, bool) {
            if(element === 'username'){
                usernameIsAvailable = bool;
            }
            else{
                emailIsAvailable = bool;
            }
        };
        Callback = function(element) {
            return function(result, textStatus){
                bool = result === "True" ? true: false;
                change_Availability(element, bool);
                return usernameIsAvailable;
            };
        };
        return{
            get_availability: function(element){
                AJAX_Availability_Check(Callback, element);
                return element === 'username' ? usernameIsAvailable : emailIsAvailable; 
            }
        }
    })();
The Problem and My Question
My problem The input correctly validates whether the username is already in use, but the user needs to trigger validation twice since get_availability returns before the Callback can change usernameIsAvailable to the proper boolean.
My Question How do I restructure my code so my custom jQuery validate method is invoked by the callback? Or how do I ensure that it won't validate until the Callback returns?
 
     
    