JavaScript-循环发送Ajax请求造成变量被替换的问题?
<script language="language">
for (var i = 0; i < 3; i++){
$.ajax({
url: "ajax.php",
success: function(data){
alert(i);
}
});
}
</script>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
var i=0;
function ajax(i) {
$.ajax({
url: "aa.php?a="+Math.random(),
success: function(data){
alert(i);
if(i<2){
setTimeout(ajax(++i),500);
}
}
});
}
ajax(i);
这样不知道能不能满足你的要求
变量覆盖,想个办法别人覆盖不就行了。。
for (var i = 0; i < 3; i++){
var a = new ajax(i);
a.send();
}
function ajax(i) {
this.count = i;
this.send = function(){
var _this = this;
$.ajax({
url: "test.php?a="+Math.random(),
success: function(data){
alert(_this.count);
}
});
}
}
ie6测试通过。没有装其他浏览器。。大家可以在其他浏览器上试试
可能我的办法不是最好的,但是应该是可行的:
在for循环里到达ajax请求的时候把i变量值作为ajax的参数键值{num:i}直接发送,
返回时的json里直接
success: function(data){
alert(data.num); //在这里输出你要的1,2,3
}
当然应该从js的角度还有别的解决办法,我这个你就参考一下
这里的问题是多个回调函数共享了变量i的作用域,所以最后只会调用i=3这个值,最好的方法肯定是采用闭包。
<script language="language">
for (var i = 0; i < 3; i++){
$.ajax({
url: "ajax.php",
success: (function(x){ //这里将i封装到闭包传递到变量x
return function(data){
alert(x); //调用x = i #0,1,2
}
})(i),
error: function(){
alert(i); //这样使用必然返回i=3
}
});
}
</script>
我发现用闭包的方式实现起来会更加灵活、代码也更精简
<script language=javascript>
for (var i = 0; i < 3; i++){
(function(i){
$.ajax({
url: "ajax.php",
success: function(data){
alert(i);
}
});
})(i);
}
</script>
不要异步,测试通过:alert:0,1,2
for (var i = 0; i < 3; i++){
$.ajax({
async:false,
url: "./t.php",
success: function(data){
alert(i);
}
});
}