JavaScript-ajax 请求出现的问题?

JavaScript-ajax 请求出现的问题?

晚风撩人 发布于 2016-12-13 字数 429 浏览 996 回复 3

请问下面的代码,输出的结果是:"/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]);
}
});
}

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

甜柠檬 2017-08-25 3 楼

异步请求是不会阻塞当前的循环的。当第一次请求还没有收到响应时,第二个请求就已经发送了,此时for循环内的局部变量 url="/b", i=2 (大于urls的长度了)。等到两个请求都接收到响应的时候(虽然发送的请求是正确),打印的结果却全部都是for 循环完毕后的结果,也就是 "/b undefined" "/b undefined"。

如果使用同步一次发送请求(async=false),就是正常的结果了 "/a /a" "/b /b"。

泛泛之交 2017-08-13 2 楼

我拿你的两段代码运行的结果是一样,因为我是在本地调试所以就可以解释了,因为$.ajax()默认是异步请求,所以请求发出去了,但是客户端的代码还会继续执行,也就是for还是会循环的,之所以我这是一样的,是因为我的请求返回快,所以显示的是正常的,而当你需要走网络时在速度上就比较慢了,所以此时for循环已经往下执行了,那就会显示。而当你把async设为falsh就为同步执行,也就是说必须等请求返回再往下执行,所以输出的是第二段代码的值,所以是正确的。

至于你说的浏览器卡死的原因可能是网络不通所以请求一直处于等待,而请求没有返回,那么客户端的timeout: 3000 是不起作用的,除非把浏览器停止了,否则还会在执行。这个只是个人的猜测,没有具体环境测试,不太清楚。你也可以通过抓包工具抓个包看看,具体是慢在哪里,是请求未返回,还是本机的内存泄漏?或者是其它代码引起的?

甜柠檬 2017-05-08 1 楼

urls.length??这个数是多少!你打印输出一下,循环里加ajax?这个你要考虑好,可能循环有问题!