【发布时间】:2015-05-14 21:59:35
【问题描述】:
我有这样的事情:遍历 id 并为每个 ID 向服务器(相同域)发出 ajax 请求 (async:true) 并将接收到的数据附加到 DOM 元素。完成这项任务并不难,它确实有效。示例代码:
$.each(ids, function (index, id) {
$.ajax({
type: 'POST',
url: "http://localhost/example/"+id,
success: function (data) {
$('#content').append(data);
}
});
});
我的问题是:当我需要循环遍历多个 ID(例如 1000 个)时,它会发送大量 ajax,并且浏览器“冻结”,当我单击链接时,它会等待所有 ajax 请求完成,然后是打开点击的链接。
超时不是一个选项,因为我需要显示尽可能多的接收数据。如果需要 1 秒或 100 秒完成,这没有问题,因为用户会看到其他已完成的请求
那么,处理这个问题的最佳方法是什么?单击链接时停止 ajax 请求,例如 this ?或者有更好的方法来做到这一点
【问题讨论】:
-
如果您可能远程发送接近 1000 个 ajax 请求的任何地方,那么问题不在于浏览器冻结,而在于您的应用程序的架构非常糟糕。找到更好的方法。
-
我会说:构建一个 ID 列表并将整个列表一次性发送到服务器。
-
进一步的仅供参考 - 浏览器只能处理 6 个模拟最大连接。如果它接收到更多,它会将它们排队并按顺序处理它们(当一个连接完成时,它将打开一个新的,最多同时连接 6 个)。这就是为什么在运行数百个连接时无法从链接加载响应的原因 - 浏览器必须等到打开/排队的连接不超过 5 个,才能打开一个新的(第 6 个)加载您刚刚单击的链接的内容。
-
浏览器会限制打开请求的数量。例如,我相信 Firefox 只会做 6 个。因此,如果有一千个请求,您的请求将需要很长时间。您应该分批进行追加。一次发送 20 个或更多 ID。然后它看起来仍然是动态的,但不会阻塞作品。
-
正如前两位评论者所指出的,您从错误的方式处理问题。无需发送 1000 个单独的 AJAX 请求,您可以将您的 ID 作为数组提交,并允许服务器完成繁重的工作。再说一次,这真的取决于你对这 1000 个请求究竟做了什么。它们是简单的还是复杂的?您是否正在查询数据库?如果是,数据库是否被适当索引?
标签: javascript jquery ajax each