2009-10-22 152 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