Функция Javascript, содержащая JQuery ajax - Функция возвращает неопределенное - PullRequest
3 голосов
/ 04 августа 2010

Кто-нибудь может дать мне понять, почему это не работает? Функция возвращает неопределенное значение. Он предупреждает логические значения, но по-прежнему возвращает неопределенное значение!

Спасибо

    function IsUniqueEmail() {

        var email = $("#<%=EmailAddress.ClientID%>").val();

        if (email.length > 0) {

            $.ajax({
                url: 'handlers/validator.ashx',
                dataType: 'json',
                data: { "n": "email", "v": email },
                async: false,
                success: function(data) {
                    alert(eval(data.success));
                    return eval(data.success);
                },
                error: function(XMLHttpRequest, textStatus, errorThrown) {
                    console.log(textStatus, errorThrown);
                    return true;
                }
            });
        }            
    }

    $(document).ready(function() {

        var execScript = $(".buttonStep1").attr("href").replace("javascript:", "");

        $(".buttonStep1").attr("href", "#").click(function() {
            // Add before click logic here
            var IsOk = IsUniqueEmail();
            if (IsOk) {
                $("#EmailAddressInUseMessage").hide();
                eval(execScript);
            }
            else {
                $("#EmailAddressInUseMessage").show();
            }
        });
    });

это ответ на вызов ajax

    { "success": false, "error" : "ERROR_EMAILINUSE" }

Ответы [ 3 ]

7 голосов
/ 04 августа 2010

Путь выполнения скрипта при использовании AJAX не является линейным. Ваш IsUniqueEmail завершится до того, как AJAX-запрос получит ответ, ничего не возвращая.

То, что вы возвращаете, отправляется на $.ajax, который является методом, вызывающим success, и там его, вероятно, игнорируют.

Вы можете переписать свой код следующим образом:

$(document).ready(function() {
    $(".buttonStep1").click(function() {

        IsUniqueEmail();

        // never follow this link
        return false;

    });
});

Таким образом, нажатие кнопки просто запускает запрос - оно не выполняется и не выполняет никаких других действий. После этого вы делаете всю свою магию в ответе AJAX:

function IsUniqueEmail() {

    var email = $("#<%=EmailAddress.ClientID%>").val();

    if (email.length > 0) {

        $.ajax({
            url: 'handlers/validator.ashx',
            dataType: 'json',
            data: { "n": "email", "v": email },
            async: false,
            success: function(data) {
                alert(eval(data.success));

                if(eval(data.success)) {

                   // Execute code to continue after the click here

                }
            },
            error: function(XMLHttpRequest, textStatus, errorThrown) {
                console.log(textStatus, errorThrown);
                return true;
            }
        });
    }            
}
2 голосов
/ 04 августа 2010

Вы не можете сделать это таким образом.IsUniqueEmail(); будет возвращено до того, как вызов Ajax завершится.Это асинхронный !Вы должны поместить логику в функцию обратного вызова:

function IsUniqueEmail() {

    var email = $("#<%=EmailAddress.ClientID%>").val();

    if (email.length > 0) {

        $.ajax({
            url: 'handlers/validator.ashx',
            dataType: 'json',
            data: { "n": "email", "v": email },
            async: false,
            success: function(data) {
               if (data.success) {
                   $("#EmailAddressInUseMessage").hide();
                   eval(execScript);
               }
               else {
                   $("#EmailAddressInUseMessage").show();
               }
            },
            error: function(XMLHttpRequest, textStatus, errorThrown) {
                console.log(textStatus, errorThrown);
            }
        });
    }            
}

Если вы указываете тип данных как JSON, вам не нужно использовать eval для его анализа.data уже будет объектом.И даже если data.success содержит строку, сравните ее со строкой вместо использования eval: data.success == 'true'.

1 голос
/ 04 августа 2010

В дополнение к другим ответам вы можете сохранить результат вызова ajax в переменной, имеющей область действия вашей функции IsUniqueEmail. Ваш успешный обратный вызов Ajax может получить доступ к переменной и обновить ее (с помощью замыкания). После завершения вызова Ajax вы можете вернуть обновленную переменную (поскольку она не является асинхронной).

function IsUniqueEmail() { 

        var email = $("#<%=EmailAddress.ClientID%>").val(); 
        var isUnique = false;

        if (email.length > 0) { 

            $.ajax({ 
                url: 'handlers/validator.ashx', 
                dataType: 'json', 
                data: { "n": "email", "v": email }, 
                async: false, 
                success: function(data) { 
                    alert(eval(data.success)); 
                    isUnique = eval(data.success); 
                }, 
                error: function(XMLHttpRequest, textStatus, errorThrown) { 
                    console.log(textStatus, errorThrown); 
                    return true; 
                } 
            }); 
        }
        return isUnique;             
    } 
...