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