问题描述: 您好!
我的 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 闭包的文章,事实上它有点让执行/渲染同步
解决方案是什么?
最佳答案
好的,这是因为您没有轮询 onreadystatechange 函数。基本上,调用是异步的,您需要每隔几毫秒轮询一次 readyState 变量以查看它何时更改。这就是它使用 alert() 的原因 - 警报导致长时间暂停,在此期间客户端收到 AJAX 响应。在警报得到响应并且您的代码根据需要执行后检查 readyState 变量。
但是,如果没有 alert(),您的代码只会检查 readyState 变量一次
一种解决方法是通过在调用中将异步参数设置为 false 来使调用同步。这有一个缺点,即客户端将卡住,直到收到 AJAX 响应。
另一种方法是不断轮询 readyState 变量。
基本上,您不应该相信回调函数会正确执行 - 它会卡住很多次!
关于php - 如果没有 ajax readystate() 中的 alert(),循环将无法工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1607007/