2014-09-04 44 views
-1

我有一段代码,我想在所有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);这样的回调,然后检查回调函数,它也没有工作。任何人都有一个想法,我可能做错了什么?

+0

使用'异步:FALSE'是不是一个解决方案,你只是使问题变得更糟。看看延期的jQuery,并承诺对象。 – elclanrs 2014-09-04 18:33:06

+0

因此,因为有些东西是“填充领域”,有没有办法知道什么时候完成?在那里挂钩你的方法? – 2014-09-04 18:33:17

+0

为什么不尝试使用'ajaxStop'全局事件处理程序来调用autoContineCart方法。但只有在没有正在处理的Ajax请求时才会触发它。 – Karthik 2014-09-04 18:38:33

回答

0

由于您的调用已经是异步的,是否可以将处理代码移出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; 
    } 
}); 
+0

我仍然得到相同的问题,因为我需要updateNewAccountToAddressBlock();在autoContinueCart()之前完成;运行 – Trey 2014-09-04 18:46:27

0

正如上面的海报说,也许你可以移动的其他一些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 
} 
+0

我将此作为临时解决方法,但问题是:需要5秒才能继续,如果有人点击可见的按钮,它会运行该代码两次,这不是我想要的。 – Trey 2014-09-04 18:47:23

相关问题