【发布时间】:2016-03-17 09:42:48
【问题描述】:
我有一个带有 9 个 li 元素的 ul。我想在 asynch 模式下通过 ajax 向这些li 元素加载一些信息。
这很简单,不是吗?
我刚刚创建了一个for(i = 1; i<=9; i++) 循环,并调用了$.post。
失败: i 将始终为 10,因为 for 循环运行得更快,然后是 $.post。所以我们在网上搜索$.post in loop。
所有这些都具有相同的效果:不能异步工作。每次它加载第一个,然后是第二个,然后是第三个等等......有时顺序会发生变化,但每个请求都会等待前一个完成。
我使用的是 WIN 10 64 位、Apache 2.4 64 位、php 5.6 64 位。已经在debian box上试过了,效果是一样的。
在我的 php 文件中,有一个 sleep(1) 和一个 echo 'a'。
我的第一次尝试:
$('.chartContainer').each(function(index,obj) {
var cnt = index + 1;
$.post(getBaseUrl() + 'ajax.php', {dateTime: $('#chart_' + cnt).data('time'), action: 'getChartByDateTime'}, function (reponse) {
$(obj).html(reponse);
});
});
我的第二次尝试:
for (var i = 1; i <= 9; i++) {
(function (i) {
var $obj = $('#chart_' + i);
$.post(getBaseUrl() + 'ajax.php', {dateTime: $('#chart_' + i).data('time'), action: 'getChartByDateTime'}, function (reponse) {
$($obj).html(reponse);
});
})(i);
}
我的第三次尝试:
function loadResponse(i) {
var $obj = $('#chart_' + i);
$.post(getBaseUrl() + 'ajax.php', {dateTime: $('#chart_' + i).data('time'), action: 'getChartByDateTime'}, function (reponse) {
$($obj).html(reponse);
});
}
$(function () {
for (i = 1; i<=9; i++) {
loadResponse(i);
}
});
预期结果:
每 9 个 li 在 1 秒内同时加载。
有人可以引导我找到正确的解决方案吗?
编辑
也许我不清楚。在生产中,脚本将运行大约。 3 秒。如果我发送一个请求来取回所有数据,那么响应到达将需要 9*3 = 27 秒。这就是为什么我要发送 9 个请求,并在 3 秒内取回所有数据。我认为这就是我们使用线程的原因。
我想要的是在“相同”时间获取所有li 的所有数据。不是一一请求,也不是一请求。
编辑 2
好吧,伙计们,真丢脸,我想我误导了你们所有人。我的 php 脚本中有一个会话开始。
如果我删除所有内容,然后只是回显某些内容并在睡眠后死去。在这种情况下,5 个请求在 1 秒内响应,其他 4 个稍后响应。但我认为这是一个新的话题。
【问题讨论】:
-
为什么不将所有 9 个值发送到 php 脚本,处理它们并返回正确的结果?
-
就像上面评论的那样,要走的路是只使用一次请求将所有相关数据发送到服务器一次
-
好的,但这是我的问题。在生产中,脚本将运行大约。 3 秒。如果我发送一个请求,那么响应到达将需要 9*3 = 27 秒。这就是为什么我要发送 9 个请求,并在 3 秒内取回所有数据。
-
我认为您的第二次尝试没有任何问题,除了变量名 =)。这里是jsfiddle.net/a5pacfjg,由于浏览器对同时请求的限制,它一次执行6个请求。
-
@Arno 提到的会话锁定问题。抱歉虚假信息。我以前从未遇到过这种情况。给我投反对票:)