2011-08-25 80 views
2

我正在調用一個函數在一個循環中,使ajax調用。我需要等待1個Ajax呼叫才能再次撥打電話。該代碼是喜歡 -如何等待1 ajax調用結束進行另一個Ajax調用循環?

function chkAll(field, markr) { 
    var string = "document.forms[0].pCheckBox" + markr + ".checked"; 
    var temp = eval(string); 
    if (temp) { 
     if (field.length > 1) { 
      for (i = 0; i < field.length; i++) { 
       field[i].checked = true; 
       decide(field[i].id, field[i].value); 
      } 
     } 
     else { 
      field.checked = true; 
      decide(field.id, field.value); 
     } 
    } 
} 

即拍即Ajax調用的函數如下:

function decide(code, dataString) { 
    if (document.getElementById(code).checked) { 
     var url = "../PRODUCT/PCProcess_Ajax.jsp?CIMS_CSRFTOKEN=" + getTokenFromSessionId(); 
     if (window.ActiveXObject) { 
      httpRequest = new ActiveXObject("Microsoft.XMLHTTP"); 
     } else if (window.XMLHttpRequest) { 
      httpRequest = new XMLHttpRequest(); 
     } 
     httpRequest.open("POST", url, true); 
     httpRequest.onreadystatechange = processRequest; 
     httpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
     varparameters = "pScreenId=ClmReports&pEventCode=NFACREATE&pDataString=" + 
      dataString + "&pSelectName=" + code; 
     httpRequest.send(parameters); 
    } else { 
     var url = "../PRODUCT/PCProcess_Ajax.jsp?CIMS_CSRFTOKEN=" + getTokenFromSessionId(); 
     if (window.ActiveXObject) { 
      httpRequest = new ActiveXObject("Microsoft.XMLHTTP"); 
     } 
     else if (window.XMLHttpRequest) { 
      httpRequest = new XMLHttpRequest(); 
     } 
     httpRequest.open("POST", url, true); 
     httpRequest.onreadystatechange = processRequest; 
     httpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
     var parameters = "pScreenId=ClmReports&pEventCode=NFADELETE&pDataString=" + dataString; 
     httpRequest.send(parameters); 
    } 
} 
processRequest()

我只是存儲httpRequest.responseText並使用它。我想要確保一個decide()被稱爲在完成1之後。

此視圖中的任何視圖?

+0

使用jQuery,它使這個過程很容易 – Nayish

+0

抱歉,不能使用jquery.this是exixting產品代碼。 – Kaustav

回答

0

你應該重寫這個,它會使你的邏輯更簡單一些。您正在嘗試混合並匹配同步和異步。如果您必須每個複選框進行1次調用,則應該重寫代碼以使xmlhttprequest的成功/失敗回調繼續到下一個複選框。由於您具有複選框的序號位置,因此您可以繼續成功或失敗的下一個序號位置。

說實話,你最好的選擇是把它變成一個包含所有數據的Web請求。它會讓你的應用程序看起來更快,因爲它不必等待每個複選框都經歷整個請求/響應循環。

1

使用排隊系統。有一個數組在某處,你推送一個url /數據結構(基本上是一個作業隊列),以及一個var,當ajax請求未完成時標誌。將待辦事項數據推送到數組後,調用一個函數(doNextAjax()?)來檢查標誌的狀態,並在沒有未完成的作業時啓動ajax請求。如果有一個傑出的工作,該功能只是返回。

在ajax調用的成功處理程序中,只需調用此doNextAjax()函數即可啓動下一個ajax調用。

這應該讓你模擬同步請求,而不需要像真正的同步請求那樣真正捆綁瀏覽器。


好的。一些示例代碼。可能不會工作,因爲我要去把我的頭頂部,但...

var jobQueue = []; 
var ajaxActive = false; 

function addToQueue(url, data) { 
    jobQueue.push({'url' : url, 'data': data}); 
    doAjax(); 
} 

function doAjax() { 
    if (ajaxActive) { return; } // ajax request still outstanding 
    if (jobQueue.length = 0) { return; } // no more work to do 
    todo = jobQueue.pop(); 
    ajaxActive = true; 
    $.ajax({ 
     url: todo.url, 
     data: todo.data, 
     success: function(returnedata) { 
      ... do whatever you need with the returned data ... 
      ajaxActive = false; 
      doAjax(); // schedule another job, if need be. 
     }, 
     error: function(e) { 
      ... handle error ... 
      ajaxActive = false; 
      doAjax(); // schedule next job, if need be 
     } 
    }); 
} 
+0

我認爲這會工作...雖然我havnt完全得到它..你可以請你放入一個示例代碼? – Kaustav