JavaScript продолжается до завершения функции !? Аякс асинхронная путаница и решение - PullRequest
1 голос
/ 11 ноября 2010

У меня проблема.Приведенная ниже функция работает на 100%, но оператор if, который вызывает функцию, разрешается до того, как функция вернет свой результат!

Предупреждение для «test2» покажет предупреждение ДО «с результатами:» + данныекоробка делает.В чем причина?

(Проблема в том, что он ВСЕГДА разрешается в ложь, несмотря ни на что, потому что ничего не возвращается, даже если что-то будет возвращено!)

    function checkUsername ( username ) {
        $.post("ajax_messages.php",{
            func: "checkUsername",
            username: username
        }, function(data){
            alert("result: "+data);
            return data;
        });
    }

    $('.send').click( function () {
        if ( checkUsername($receiverBox.val()) == "true" ) {
            alert("test");
            return false;
        } else {
            alert("test2");
            return false;
        }
    });

Редактировать:

Спасибо за быстрые ответы.Я попробовал следующее:

    $.ajaxSetup({
        async:false
    });

Edit2: Но это также не действовало, как ожидалось.Как нормальный набор функций, так что я буду действовать.Итак, я попробую еще несколько способов ниже

Edit3: Success!Это потрясающе.Немного неуклюжий, но намного более гладкий, чем любой другой метод, который я мог найти.Я надеюсь, что это помогает

    var checkUsernameResult = false;

    function checkErrorCheckingIsComplete( ) {
        if ( checkUsernameResult != false ) {
            alert( checkUsernameResult );
        }
    }

    function checkUsername ( username ) {
        $.post("ajax_messages.php",{
            func: "checkUsername",
            username: username
        }, function(data){
            alert("result: "+data);
            checkUsernameResult = data; // each check has one of these
            checkErrorCheckingIsComplete(); // all checks have this as the end
        });
    }

    $('.send', $message_box).click( function () {
        checkUsername( $receiverBox.val() );
        //more checks here
        return false;
    });

Ответы [ 6 ]

2 голосов
/ 11 ноября 2010

Я думаю, вам, возможно, придется создать еще одну кнопку, которая выполняет отправку, потому что у вас никогда не будет ответа с асинхронными функциями Ajax.

Добавьте еще одну кнопку на свою HTML-страницу с классом «actual-send», а затем попробуйте это ...

var asynchResult = "false";
function checkUsername ( username ) {
    $.post("ajax_messages.php",{
        func: "checkUsername",
        username: username
    }, function(data){
        alert("result: "+data);
        asynchResult = data;
        $('.actual-send').trigger('click');
    });
}

$('.send').click( function () {
    checkUsername($receiverBox.val())
    return false;
}
$('.actual-send').click( function () {
    if(asynchResult == "true") {
        alert("test");
        return true;
    } else {
        alert("test2");
        return false;
    }
}
2 голосов
/ 11 ноября 2010

Поскольку AJAX-вызовы asynchronous, это происходит.Используйте функцию обратного вызова для .post и поместите в нее оператор if.

Другая вещь, которую вы можете сделать, это использовать синхронные вызовы. Но это остановит браузер от выполнения каких-либо других действий.

1 голос
/ 11 ноября 2010

Как и в других ответах, метод post () является асинхронным, поэтому он выполняется независимо от остальной части кода.

При необходимости вы можете заставить jquery вызывать сервер синхронно, используя вместо этого async:false,Я думаю, что для этого вам понадобится использовать функцию jQuery.ajax () вместо .post ().

Хотя обычно она работает намного лучше асинхронно, как вВ синхронном режиме он замораживает веб-страницу в ожидании ответа от сервера, что не очень удобно для ваших посетителей.Лучшая идея - держать его в асинхронном режиме и обрабатывать ответ сервера в обратном вызове success ().

1 голос
/ 11 ноября 2010

Я не использовал jQuery в течение нескольких месяцев, но я почти уверен, что вы можете установить флаг, чтобы вызов Ajax выполнялся как синхронный вызов.

0 голосов
/ 11 ноября 2010

поставить асинхронно: false

0 голосов
/ 11 ноября 2010

вы можете использовать следующее:

$.ajax({
  type: 'POST',
  url: 'ajax_messages.php',
  data: data,
  success: function(html){
   alert(html); 
  }
  dataType: dataType
});

так, при успешном выполнении POST выполняется функция, которая захватывает все, что будет отображаться в вашем ajax_messages.php, и оповещает его

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