JavaScript-ajax 请求出现的问题?
请问下面的代码,输出的结果是:"/b undefined" "/b undefined"
var urls = ["/a", "/b"];
for (var i = 0; i < urls.length; i++) {
var url = urls[i];
$.ajax({
url: url,
type: "GET",
complete: function(data) {
console.log(url, urls[i]);
}
});
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
异步请求是不会阻塞当前的循环的。当第一次请求还没有收到响应时,第二个请求就已经发送了,此时for循环内的局部变量 url="/b", i=2 (大于urls的长度了)。等到两个请求都接收到响应的时候(虽然发送的请求是正确),打印的结果却全部都是for 循环完毕后的结果,也就是 "/b undefined" "/b undefined"。
如果使用同步一次发送请求(async=false),就是正常的结果了 "/a /a" "/b /b"。
我拿你的两段代码运行的结果是一样,因为我是在本地调试所以就可以解释了,因为$.ajax()默认是异步请求,所以请求发出去了,但是客户端的代码还会继续执行,也就是for还是会循环的,之所以我这是一样的,是因为我的请求返回快,所以显示的是正常的,而当你需要走网络时在速度上就比较慢了,所以此时for循环已经往下执行了,那就会显示。而当你把async设为falsh就为同步执行,也就是说必须等请求返回再往下执行,所以输出的是第二段代码的值,所以是正确的。
至于你说的浏览器卡死的原因可能是网络不通所以请求一直处于等待,而请求没有返回,那么客户端的timeout: 3000 是不起作用的,除非把浏览器停止了,否则还会在执行。这个只是个人的猜测,没有具体环境测试,不太清楚。你也可以通过抓包工具抓个包看看,具体是慢在哪里,是请求未返回,还是本机的内存泄漏?或者是其它代码引起的?
urls.length??这个数是多少!你打印输出一下,循环里加ajax?这个你要考虑好,可能循环有问题!