JavaScript在功能完成之前继续!? Ajax异步混淆和解决方案

时间:2010-11-11 12:36:36

标签: javascript jquery function

我遇到了问题。下面的函数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:但这也没有按预期行事。作为一套正常的功能,我将被期望采取行动。所以我将尝试更多下面的方法

编辑3:成功!太棒了。有点笨拙,但比我能找到的任何其他方法更顺畅。我希望这有帮助

    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 个答案:

答案 0 :(得分:2)

由于AJAX调用是asynchronous,因此会发生这种情况。使用.post的回调函数并将if语句放入其中。

您可以做的另一件事是使用同步调用。但这会阻止浏览器在此期间执行任何其他操作。

答案 1 :(得分:2)

我认为您可能必须创建另一个执行提交的按钮,因为您永远不会使用Ajax的异步函数进行响应。

使用“实际发送”类向HTML页面添加另一个按钮,然后尝试此...

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 :(得分:1)

我几个月没有使用过jQuery,但我很确定你可以设置一个标志来强制Ajax调用作为同步调用发生。

答案 3 :(得分:1)

正如其他答案所说,post()方法是异步的,因此它独立于其余代码执行。

如果有必要,您可以强制jquery使用async:false同步调用服务器,我认为您必须使用jQuery.ajax()函数而不是.post()简写来执行此操作。

它通常可以更好地异步工作,因为在同步模式下,它会在等待来自服务器的响应时冻结网页 - 这对访问者来说不是很棒的体验。更好的想法是将其保持在异步模式并在success()回调中处理服务器响应。

答案 4 :(得分:0)

您可以使用以下内容:

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

所以,在POST成功执行函数,它会抓取你的ajax_messages.php回显和警告的任何内容

答案 5 :(得分:0)

put asynchronous:false