3

问题描述:您好!

我的 XMLHTTPRequest 对象在准备好后会做几件事。我收到的 responseText 被拆分,并作为参数发送到myFunction().

现在,我需要调用myFunction()'n' 次,并将响应文本的子字符串作为参数。

这有效:

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 循环中的代码不会运行,除非 alert() 未注释。我在某处读过关于 javascript 闭包的文章,以及它让执行/渲染保持同步的事实

解决方案是什么?

4

1 回答 1

3

好的,这是因为您没有轮询 onreadystatechange 函数。基本上,调用是异步的,您需要每隔几毫秒轮询一次 readyState 变量以查看它何时更改。这就是它使用 alert() 的原因 - 警报导致客户端收到 AJAX 响应的长时间暂停。在警报得到响应并且您的代码根据需要执行后检查 readyState 变量。

但是,如果没有 alert(),您的代码只会检查一次readyState 变量

一种解决方法是通过在调用中将异步参数设置为 false 来使调用同步。这有一个缺点,客户端将冻结,直到收到 AJAX 响应。

另一种方法是不断轮询 readyState 变量。

基本上,你不应该相信回调函数能正确执行——它会被卡住很多次!

于 2009-10-22T13:02:51.883 回答