Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript在函数完成之前继续!?Ajax异步混淆及解决方案_Javascript_Jquery_Function - Fatal编程技术网

JavaScript在函数完成之前继续!?Ajax异步混淆及解决方案

JavaScript在函数完成之前继续!?Ajax异步混淆及解决方案,javascript,jquery,function,Javascript,Jquery,Function,我有个问题。下面的函数可以100%工作,但是调用函数的if语句在函数返回结果之前解析 “test2”的警报将显示在带有“结果:+数据框”的警报之前。原因是什么 (问题是,无论发生什么情况,它都会解析为false,因为即使要返回某些内容,也不会返回任何内容!) 编辑: 谢谢你的迅速回复。我尝试了以下方法: $.ajaxSetup({ async:false }); Edit2:但这也没有达到预期效果。作为一个正常的功能集,我将被期望采取行动。因此,我将尝试下面的一

我有个问题。下面的函数可以100%工作,但是调用函数的
if
语句在函数返回结果之前解析

“test2”的警报将显示在带有“结果:+数据框”的警报之前。原因是什么

(问题是,无论发生什么情况,它都会解析为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;
    });

由于AJAX调用是异步的,所以会发生这种情况。对
.post
使用回调函数,并将if语句放入其中


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

因为AJAX调用是异步的,所以会发生这种情况。对
.post
使用回调函数,并将if语句放入其中


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

我已经几个月没有使用jQuery了,但我非常确定您可以设置一个标志,强制Ajax调用作为同步调用进行。

我已经几个月没有使用jQuery了,但是我非常确定您可以设置一个标志,强制Ajax调用作为同步调用进行。

您可以使用以下命令:

$.ajax({ type: 'POST', url: 'ajax_messages.php', data: data, success: function(html){ alert(html); } dataType: dataType }); $.ajax({ 键入:“POST”, url:'ajax_messages.php', 数据:数据, 成功:函数(html){ 警报(html); } 数据类型:数据类型 });
因此,在POST success execute函数中,它会捕获ajax_messages.php将响应的内容并发出警报,您可以使用以下功能:

$.ajax({ type: 'POST', url: 'ajax_messages.php', data: data, success: function(html){ alert(html); } dataType: dataType }); $.ajax({ 键入:“POST”, url:'ajax_messages.php', 数据:数据, 成功:函数(html){ 警报(html); } 数据类型:数据类型 });
因此,在POST success执行函数时,它将捕获ajax_messages.php的任何内容,并用它进行回音和警报

put asynchronous:false

put asynchronous:false

我认为您可能必须创建另一个执行提交的按钮,因为您永远不会得到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;
    }
}

我认为您可能需要创建另一个执行提交的按钮,因为您永远不会得到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;
    }
}

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

如果有必要,您可以强制jquery使用
async:false
同步调用服务器,但我认为您必须使用函数而不是.post()速记来实现这一点


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

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

如果有必要,您可以强制jquery使用
async:false
同步调用服务器,但我认为您必须使用函数而不是.post()速记来实现这一点


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

无法使用$.ajax并将async设置为false?啊,那么将check if语句添加到回调中?我现在就试试嗯,虽然这会起作用,但我无法通过这种方法处理提交框的点击。。。虽然我可以不断地在代码中添加越来越深的检查,但我认为这是一种不好的做法?您可以将
async
属性设置为
false
,使其成为一个同步调用。不能使用$.ajax并将async设置为false吗?啊,那么将check-if语句添加到回调中?我现在就试试嗯,虽然这会起作用,但我无法通过这种方法处理提交框的点击。。。虽然我可以不断地在代码中添加越来越深的检查,但我认为这是一种不好的做法?您可以将
async
属性设置为
false
,使其成为一个同步调用。这是一种比Rahul所说的更复杂的回答,并且再次迫使我。。那个词是什么。。。嵌套所有动态错误检查。。。这并不是我真正想要的,因为这是一个糟糕的做法。这是一个比拉胡尔所说的更复杂的答案,它再次迫使我。。那个词是什么。。。嵌套所有动态错误检查。。。这并不是我真正想要的,因为这是一个糟糕的做法,你可以这样做,但请记住,你会在执行AJAX时锁定浏览器。您还需要在jQuery中使用AJAX属性。是的,但是有没有一种不强迫用户在回调中嵌套处理程序的方法呢?如果不使用异步,那么在“a”JAX中使用“a”的目的是什么;-)我不介意使用asynchronus,我现在只需要找到一种使用它的方法。您可以这样做,但请记住,在执行AJAX时,您将锁定浏览器。您还需要在jQuery中使用AJAX属性。是的,但是有没有一种方法可以不强迫用户