jquery Ajax回调没有按正确顺序工作
我有一段代码,我想在所有ajax完成后运行。 我想运行的功能是:jquery Ajax回调没有按正确顺序工作
function autoContinueCart(){
$('.nextSection a:visible').click();
}
该点击事件运行验证脚本,并移动到下一部分。继承人主要阿贾克斯。
$('#SubmitLoginOpc').click(function() {
$.ajax({
type:'POST',
url:authenticationUrl,
async:false,
cache:false,
dataType:"json",
data:'SubmitLogin=true&ajax=true&email=' + encodeURIComponent($('#login_email').val()) + '&passwd=' + encodeURIComponent($('#login_passwd').val()) + '&token=' + static_token,
success:function (jsonData) {
if (jsonData.hasError) {
//error stuff
}
else {
// update token
static_token = jsonData.token;
$('#dlv_label, #new_label').removeClass('new-l').addClass('logged-l'); // change label on delivery address section
updateNewAccountToAddressBlock();
// RESET ERROR(S) MESSAGE(S)
$('#opc_account_errors').html('').hide();
$('#opc_account_errors_invoice').html('').hide();
//It doesnt work here
//autoContinueCart();
}
},
//doesnt work here
// complete:autoContinueCart
});
return false;
});
我已经把这个函数调用放在成功的一部分,我认为它会工作,因为它是同步的。在ajax调用之后,我也把它作为完整的.done函数,并且在所有内部代码完成之前它仍然运行。函数updateNewAccountToAddressBlock();
基本上使用这种类型async:true
产生另一个jquery ajax请求,并返回json,然后在成功调用中使用约10个函数或子函数。其中一个使用这些数据来填写表单的所有字段。我试图在最后调用的函数应该验证正在填充的信息。但无论我尝试什么,验证都会失败,因为autoContineCart正在填充字段之前运行。我也尝试使用像updateNewAccountToAddressBlock(updateAddressSelection);
这样的回调,然后检查回调函数,它也没有工作。任何人都有一个想法,我可能做错了什么?
由于您的调用已经是异步的,是否可以将处理代码移出ajax回调函数?这将确保所有的ajax部分在移动到加工件之前完成。
例子:
$('#SubmitLoginOpc').click(function() {
$.ajax({
type:'POST',
url:authenticationUrl,
async:false,
cache:false,
dataType:"json",
data:'SubmitLogin=true&ajax=true&email=' + encodeURIComponent($('#login_email').val()) + '&passwd=' + encodeURIComponent($('#login_passwd').val()) + '&token=' + static_token
},
success: function(jsonData) {
$('#SubmitLoginOpc').data("some_key",jsonData);
}
//doesnt work here
// complete:autoContinueCart
});
jsonData = $('#SubmitLoginOpc').data("some_key");
if (jsonData.hasError) {
//error stuff
}
else {
// update token
static_token = jsonData.token;
$('#dlv_label, #new_label').removeClass('new-l').addClass('logged-l'); // change label on delivery address section
updateNewAccountToAddressBlock();
// RESET ERROR(S) MESSAGE(S)
$('#opc_account_errors').html('').hide();
$('#opc_account_errors_invoice').html('').hide();
//It doesnt work here
//autoContinueCart();
return false;
}
});
我仍然得到相同的问题,因为我需要updateNewAccountToAddressBlock();在autoContinueCart()之前完成;运行 – Trey 2014-09-04 18:46:27
正如上面的海报说,也许你可以移动的其他一些AJAX功能,从同一个js文件运行,或将一些PHP函数在同一运行作为第一个电话的时间。
理想情况下,你不应该做另一个Ajax请求,因为PHP /任何已经有它需要从客户端的信息。你应该可以将这些数据发送到其他php /脚本。
如果您确实需要执行另一个ajax调用,也许让用户等待强制秒,然后再运行ajax调用。
例如:
$ajax.done(
// code
if (success)
{
setTimeout('foo', 5000);
$('#spinner').show();
}
function foo()
{
$('#spinner').hide();
//second ajax request
}
我将此作为临时解决方法,但问题是:需要5秒才能继续,如果有人点击可见的按钮,它会运行该代码两次,这不是我想要的。 – Trey 2014-09-04 18:47:23
使用'异步:FALSE'是不是一个解决方案,你只是使问题变得更糟。看看延期的jQuery,并承诺对象。 – elclanrs 2014-09-04 18:33:06
因此,因为有些东西是“填充领域”,有没有办法知道什么时候完成?在那里挂钩你的方法? – 2014-09-04 18:33:17
为什么不尝试使用'ajaxStop'全局事件处理程序来调用autoContineCart方法。但只有在没有正在处理的Ajax请求时才会触发它。 – Karthik 2014-09-04 18:38:33