来自循环的$ .post调用

时间:2016-03-17 09:42:49

标签: php jquery ajax

我有ul个9个li元素。我想通过 asynch 模式下的ajax将一些信息加载到这些li元素。

这很简单,不是吗?

我刚刚创建了一个for(i = 1; i<=9; i++)循环,并调用了$.post

失败: i将始终为10,因为for循环运行速度更快,然后是$.post。因此,让我们在网上搜索$.post in loop

我找到了三个解决方案。两个是here,一个是here

所有这些都具有相同的效果:不能异步工作。每次加载第一个,然后加载第二个,然后加载第三个等等...有时订单正在改变,但每个请求都在上一次完成时等待。

我使用的是WIN 10 64bit,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秒内收回所有数据的原因。我想这就是我们使用线程的原因。

我想要的是获取&#34;相同&#34;中所有li的所有数据。时间。不是一个接一个,也不是一个一个请求。

编辑2

好吧,伙计们,对我感到羞耻,我想我误导了你们所有人。我的php脚本中有一个会话开始。

如果我删除所有内容,然后只是回应一些东西并在睡眠后死亡。在这种情况下,5个请求在1秒内响应,其他4个在稍后。但我认为这是一个新的问题。

4 个答案:

答案 0 :(得分:2)

来自jQuery手册:

  

默认情况下,所有请求都是异步发送的(默认情况下设置为true)。如果需要同步请求,请将此选项设置为false。跨域请求和dataType:&#34; jsonp&#34;请求不支持同步操作。请注意,同步请求可能会暂时锁定浏览器,并在请求处于活动状态时禁用任何操作。

您确定浏览器未发送请求吗?您的PHP脚本可能不允许多个会话。您是否尝试过使用firebug / chrome检查器检查ajax调用?

编辑:

  

默认情况下,PHP会将其会话数据写入文件。当请求启动会话的PHP脚本(session_start())时,此会话文件被锁定。这意味着如果您的网页向PHP脚本发出大量请求,例如,通过Ajax加载内容,则每个请求都可能锁定会话并阻止其他请求完成。

     

其他请求将在session_start()上挂起,直到会话文件解锁。如果您的一个Ajax请求相对较长,那么这尤其糟糕。

可能的解决方案:

  1. 当您不需要时,请不要使用会话
  2. 阅读/撰写必要信息后关闭会话:

    session_write_close(); 
    
  3. 将您的会话存储在Redis / mySQL中,例如

答案 1 :(得分:1)

function loadResponse(i) {

    var $obj = $('#chart_' + i);
    $.post(getBaseUrl() + 'ajax.php', {dateTime: $('#chart_' + i).data('time'), action: 'getChartByDateTime'}, function (reponse) {
        $($obj).html(reponse);
        if(i<=9) loadResponse(++i);
    });
}
var i = 1;
$(function () {
    loadResponse(i);
});

这里首次在页面加载时调用loadResponse函数。然后在POST请求的响应中递归调用它。

答案 2 :(得分:0)

你可以试试这个。

video = (VideoView) findViewById(R.id.video);
new BackgroundAsyncTask().execute("link-to-the-video");

答案 3 :(得分:0)

尝试一次发送所有数据

var dateTime = [];
$('.chartContainer').each(function(index,obj) {
    var cnt = index + 1;
    dateTime.push({date:$('#chart_' + cnt).data('time'),el:'#chart_' + cnt});

});
 $.post(getBaseUrl() + 'ajax.php', {dateTime:dateTime , action: 'getChartByDateTime'}, function (reponse) {
       $.each(reponse,function(i,v){
          $(v.el).html(v.procesedData);
       });

    });

php:

$ajaxresponse =[];
foreach($_POST['dateTime'] as $datetime) {
   $data = $datetime['date'];//change this with your results
   $ajaxresponse[]= array('procesedData'=>$data,'id'=>$datetime['id'])
}

return json_encode($ajaxresponse);