2014-09-04 76 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

相關問題