Почему эта функция AJAX / Javascript не работает должным образом, пока ее не вызовут во второй раз? - PullRequest
0 голосов
/ 29 июня 2019

Я пытался обернуть голову вокруг запросов AJAX и в настоящее время реализую некоторую проверку на стороне сервера для мастера twitter-bootstrap в Javascript. Я испытываю какое-то странное поведение, когда функция завершается с ошибкой при первом ее выполнении, но работает во второй раз, как предполагалось. Я упростил свой код в этой структуре:

function do_ajax_validate($user,$email) {
    $.ajax({url: "checkuser.php?field=username&query=" + $user, success: function(result){
        if (result != 'Valid')
            {
                $("#userlabel").html(result);
                $("#userdiv").addClass("has-error");
                $("#userdiv").removeClass("has-success");
                $("#username").focus();
                is_good[0] = false;

            } else {
                $("#userlabel").html($user + " is available!");
                $("#userdiv").removeClass("has-error");
                $("#userdiv").addClass("has-success");
                is_good[0] = true;
                console.log(is_good[0]);

            }
    }});

    console.log(is_good[0]);    

    $.ajax({url: "checkuser.php?field=email&query=" + $email, success: function(result){
        if (result != 'Valid')
            {
                $("#emaillabel").html(result);
                $("#emaildiv").addClass("has-error");
                $("#emaildiv").removeClass("has-success")
                $("#email").focus()
                is_good[1] = false;

            } else {
                $("#emaillabel").html('Looks good!');
                $("#emaildiv").removeClass("has-error");
                $("#emaildiv").addClass("has-success")
                is_good[1] = true;
            }
    }});

    console.log(is_good[0]);
    console.log(is_good[1]);
    if ((is_good[0])&&(is_good[1])) {
        return true;
    }  else {
        return false;
    }
}

Всякий раз, когда я захожу в консоль и пытаюсь запустить функцию, я вызываю ее с помощью доступного мне пользователя / электронной почты и получаю такой вывод:

do_ajax_validate('available_username', 'available@email.address');
false
false
false

Всякий раз, когда я запускаю точно такую ​​же строку, я получаю такой вывод:

do_ajax_validate('available_username', 'available@email.address');
true
true
true

Затем проверка имени пользователя / электронной почты, которые, как я знаю, заняты, возвращает последние значения:

do_ajax_validate('taken_username', 'taken@email.address');
true
true
true

И (как вы уже догадались) - повторное выполнение функции возвращает ожидаемые результаты:

do_ajax_validate('available_username', 'available@email.address');
false
false
false

Я часами пробовал разные методы и получал те же самые странные результаты. Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 29 июня 2019

У этой проблемы может быть два решения:

  1. Работа с результатом внутри обратного вызова, который вы присваиваете свойству success. Попробуйте сохранить результат под свойством успеха
  2. используйте async: false при вызове AJAX, например:

$. Аякс ({ url: "checkuser.php? field = username & query =" + $ user, асинхронный: ложный, success: function (result) { ( "Результат") console.log }});

0 голосов
/ 29 июня 2019

Ajax-вызовы выполняются асинхронно в javascript. Ваш success обратный вызов будет выполнен только после возврата Ajax-вызова, поэтому ваши console.log() s могут быть вызваны до выполнения функций success.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...