for循环ajax带来的问题。这里使用的是jquery封装的ajax。ajax设置了同步,当快速执行ajax会出问题

页面上面for(var i =0;i<9;i++){
$.ajax({
type:"post",
dataType:"xml",
async:false,
url:"xxxxx",
success:function(data){
.....
},
error:function(data){
.....
}
}).
这段时间一直被一个问题纠结着。本来是想for循环里面执行一次ajax然后ajax请求一下后台,后台给了返回信息,然后再执行下一次ajax请求,但是for循环执行前面几次还正常。但是当执行到后面比如说执行到第5次的时候,ajax不会跳转到那个url去,而是直接就返回error:funtion(){}了。不知道这是为什么?求解?
我在思考,是不是ajax调用得太快了。当调用成功一次之后,他的状态还没有从200变回来,就开始执行下一次的ajax了。这样他本身就当成是完成了调用了,但是调用的结果却没有,所以就执行了error:function了?

首先你的这个实现逻辑就有问题,怎么可能会想到用for 去做n次ajax提交呢,你得知道你现在上面写的这种ajax提交方式为异步方式,何为异步,就是当ajax请求发出后当前逻辑就认为你的这次请求完成了,当前逻辑会继续往下执行而不会去管你的这个ajax请求是否执行完并成功返回的,如你for了10次,那么for只会管执行10个ajax提交,因为ajax是异步方式,所以你在for里面无法控制你的这10次ajax是否都正常的执行并返回的,这10次ajax提交的返回是无序的。所以一般都不会用这样的逻辑来处理问题,如果实在非得要用这种逻辑,那么得将ajax请求方式改成同步方式,即将async:false 改成 async:true,这样就可能如你的预期,一个ajax执行完正常返回后才行下一个ajax,

==================================================================
哦,那是我记错咯,如果你实在要用这种实现逻辑的话,我倒建议你不要这么写,类似下面这种写法应该好处理些的:
for (var i=0; i<9; i++)
{
var post_data = new Array('rand':new Date().getMilliseconds())
var post_retn = eval('('+ $.ajax({type:'post', data:post_data, url:'xxxxx&rand=' + new Date().getMilliseconds(), async:false}).responseText +')');
alert(post_retn);
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-12-15
for循环执行速度太快了,ajax的请求和返回数据以及处理需要时间的。
建议换成定时执行,定义一个全局变量,然后每执行一次,变量就加1,直到9为止,然后清除定时器。追问

恩 我也感觉是for循环执行得太快了。现在的问题是这个定时器怎么来制定,我怎么知道后台什么时候能够给我返回。还有就是我刚才测试了下,error:function里面返回的status是200,但是url指向的后台代码根本就没有执行。奇怪了

追答

你是依次执行吗?
可以设定为每秒执行一次,判断上一次是否执行成功,如果执行成功的话就进行下一次执行,否则的话就不执行。

第2个回答  2011-12-15
error函数可以打印出错误原因、代码之类的信息吧
第3个回答  2011-12-15