2009-10-22 153 views
3

問題描述: 你好!我的XMLHTTPRequest對象在準備好時會執行一些操作,因爲我將接收到的responseText分解並作爲參數發送給m​​yFunction() 現在,我需要調用myFunction()' n'次,響應文本的子串作爲參數。循環不工作沒有alert()在ajax readystate()

這個工程:

myAjaxObj.onreadystatechange=function() 
    { 
     if(myAjaxObj.readyState==4) 
     { 
      if(myAjaxObj.status==200) 
         { 
          myFunction(myAjaxObj.responseText, id) 

這並不工作:

myAjaxObj.onreadystatechange=function() 
    { 
     if(myAjaxObj.readyState==4) 
     { 
      if(myAjaxObj.status==200) 
         { 
          var count i=0; 
          for(i=0; i < 5; i++) 
          { 
           [b]alert("Without this it wont work") [/b] 
           myFunction(myAjaxObj.responseText, i); 
          } 

基本上,for循環中的代碼不會運行,除非警報()沒有註釋。 我讀過關於JavaScript關閉的地方,它有點讓執行/渲染得到同步的事實

什麼是解決方案?

+0

你能確定這個問題說明了你的想法嗎?第一個示例Works?好吧,它聽起來對我來說很合適。然而,根據第二個例子的頭文件,第二個例子不起作用,但第二個例子下面的描述說明了它的作用。這是什麼? – AnthonyWJones 2009-10-22 13:17:27

+0

@Anthony: 第二個ex,「works」wid alert()enabled ... 如果我評論警報,那麼它不會。 它是渲染和代碼執行之間的某種同步問題嗎? – empcarl 2009-10-28 07:32:16

回答

2

好的,這是因爲你沒有輪詢你的onreadystatechange函數。基本上,這個調用是異步的,你需要每隔幾毫秒輪詢你的readyState變量,看看它什麼時候改變。這就是它使用alert()的原因 - 警報導致客戶端收到AJAX響應的長時間停頓。 readyState變量在警報獲得響應並且您的代碼根據需要執行後進行檢查。

然而,如果沒有警報(),對於readyState的變量只是一次

一種方式在你的代碼檢查是在調用異步參數設置爲false撥打電話同步。這有一個不利之處,客戶端將凍結,直到收到AJAX響應。

另一種方法是繼續輪詢readyState變量。

基本上,你不應該相信回調函數來正確執行它 - 它會被卡住很多次!

+0

我不確定這是否解釋問題中的情況。 readyState 4是最後的狀態,所以我看不出警報的存在如何影響任何事情。 – AnthonyWJones 2009-10-22 13:14:43