2015-07-10 38 views
1

我的話題已經在這裏被廣泛覆蓋。我搜索了很多,並嘗試了很多代碼,但沒有找到任何有助於我解決我的具體情況。所以我想向社區提出這個問題。基於來自AJAX調用的響應,我如何擺脫javascript循環?

我正在構建一個頁面,其中有12個表單字段,我循環訪問這些字段並進行AJAX調用以測試數據庫的值。我的問題是,我需要停止我的循環,並根據來自我的AJAX調用的特定響應獲取用戶輸入。到目前爲止,我一直無法阻止我的循環,直到它結束。

這裏是我的形式:

<form name="claimForm"> 
<table> 
<tr> 
<td> <input type="text" id="icdcode1"></td> 
<td> <input type="text" id="icdcode2"></td> 
<td> <input type="text" id="icdcode3"></td> 
<td> <input type="text" id="icdcode4"></td> 

</tr> 

<tr> 
<td> <input type="text" id="icdcode5"></td> 
<td> <input type="text" id="icdcode6"></td> 
<td> <input type="text" id="icdcode7"></td> 
<td> <input type="text" id="icdcode8"></td> 

</tr> 

<tr> 
<td><input type="text" id="icdcode9"> </td> 
<td> <input type="text" id="icdcode10"></td> 
<td> <input type="text" id="icdcode11"></td> 
<td> <input type="text" id="icdcode12"></td> 

</tr> 

<tr> <td colspan="4"> <input type="button" value="Check IDC Code" onClick="javascript:claimValidate();"></td></tr> 
</table> 


</form> 

<div id="pageresponse"></span> 

這裏是我的claimValidate功能:

function claimValidate() { 

var isFound = false; 
for (i = 1; i <= 12; i++) { 

    var icdcode = 'icdcode'+i; 

    if (!isFound) { 
     if(document.getElementById(icdcode)) { 
      var retrieved = document.getElementById(icdcode).value; 

       if (retrieved != "") { 

         if (ajaxCheck(retrieved)) { 

         } 


       } // end if retrieved 

     } // end if document.getElementbyId 
    } // end if !isFound  



} // end claimValidate 

,這裏是我的ajaxCheck功能

function ajaxCheck(icdcode) { 

var xmlhttp = new XMLHttpRequest();  

xmlhttp.onreadystatechange = function() { 
     if (xmlhttp.readyState == 4) { 
      //alert(isFound) 
      resp = xmlhttp.responseText; 

      if (resp == icdcode) { 
       return true; 
      } else if (resp == "Search Failed") { 
       alert("You must enter a valid issue code.") 
       return false; 
      } // end if resp 

     if ((resp !== "Search Failed") && (resp.length > 0)) { 
       document.getElementById("pageresponse").innerHTML = resp; 
       return false; 
      } 

     } // end readystate 

    } // end onreadystatechange 

       xmlhttp.open("GET", "validate_idc_code.asp?q=" + icdcode, true); 
       xmlhttp.send(); 

} // end ajaxCheck 

我的意圖是打出來的循環並停止,如果它在ajaxCheck中的最終if語句,但它不是,我不知道爲什麼。我向同事展示了我的代碼,他似乎認爲ajaxCheck實際上不會返回任何內容,因爲它是在單獨的函數中調用的。他建議將我所有的表單字段作爲一個數組傳遞給我正在做數據庫檢查的ASP頁面,但我不確定這是最佳解決方案。

我會感謝任何指導專家可以提供給我。

謝謝!

克里斯 -

+4

你提到它已被廣泛覆蓋在這裏,你見過[這個問題](http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-asynchronous-call)?基本上你的'ajaxCheck'函數不能以這種方式返回一個在循環中使用的值。你需要重構一些。 –

+1

你不能,除非你切換到使用同步調用,或分裂你的邏輯,以便在ajax調用的成功處理程序中執行「得到響應」邏輯。 –

+0

感謝您的回覆。我還沒有看到@James Thorpe所鏈接的文章。這看起來是處理我想要完成的一個好方法。我會試試看。 – ChrisC

回答

1

那麼你可以使用全局變量,表明你希望你的循環繼續或停止這樣做。 然後claimValidate你會把類似

if (!loopActive) return; 

但是,這是一個不好的做法。最好的是重組像@MarcB和@JamesThorpe提供了建議。

我只回答這個理念,因爲我明白,爲了學習任何事情,你必須以最佳方式開始進步,然後逐步理解爲什麼這不是最佳實踐。

+1

這隻有在請求是同步的時候纔會起作用(無論如何你確實想避免它們 - 它們已被棄用,並且可能在某個時候被刪除)。使用異步請求,您會發現整個循環在第一個Ajax請求返回之前運行。 –