在ajax函数的同时处理ajax函数

时间:2012-05-11 10:28:41

标签: php ajax apache jquery

我有一个发送X邮件的PHP进程在每次邮件发送后,我在数据库上添加一行,告诉他们发送邮件。

所以,我不想创建一个进度条告诉用户X上的邮件被发送(Y =总数)

我有两个类似的jquery函数:

function mail_send()
{
    var refreshIntervalId;
    $('.loading').css('display','block');
    $.ajax({
        'url': '/an/url/', 
        'data': {
                    someParam: param
                },
        'beforeSend':function()
                    {
                        $('#loadingBg').append('<span id="count"></span>');
                        refreshIntervalId =setInterval(function () {
                            mail_updateProgress(id);
                        }, 500);
                    }

        , 
        'success':  function (data,textStatus)
                    {
                       (....)
                       clearInterval(refreshIntervalId);
                       javascript: console.log(' send finish !!!');
                    }
    });
}

function mail_updateProgress(id) {
    javascript: console.log('updatePG');
    $.ajax({
        'url': '/an/url/', 
            'data': {
                        someParam: param
                    },
        'success':  function (data) {
                        var res = $.parseJSON(data);
                        javascript: console.log('  => data received ' + res.nbSended);
                        $('#count').html(res.nbSended + '/' + res.total);
                    }
    });
}

$ .ajax有队列吗?我登录3件事:第一:当进程在updateProgress函数上输入第二:当updateProgress ajax成功第三时:当mail_send()ajax成功时

日志的顺序是:

  • updatePG =&gt; 100次(我已经在我的PHP代码中睡了以进行测试)
  • 发送结束!!! =&GT; 1次
  • =&GT;收到的数据11 =&gt; X次(我发送11封邮件)

所以对我而言,它告诉我有一个ajax调用的队列。但是我怎样才能执行我的进度条呢?

编辑: 它可能是一个php配置问题,

有人可以告诉我如何允许来自同一个流程的多连接?

2 个答案:

答案 0 :(得分:1)

您可能遇到的问题是,Web浏览器的任何域运行的并发Web请求不超过2个。您正尝试使用此功能填充这两个插槽。如果不了解有关您正在构建的应用程序的更多信息,那么这就是我现在可以猜到的所有信息。

我认为,更好的方法是考虑终止您的邮件发送请求的客户端连接,并在客户端终止之后继续该过程。这将为您的浏览器释放一个http请求插槽,并且应该允许您的mailProgress ajax函数继续按写入方式运行,而不必担心队列等等。

这是关于忽略客户端终止的另一个Stack Overflow问题:Can a PHP script continue running after ending the HTTP request?

以及一篇博文,其中详细介绍了如何操作(在上面的Stack Overflow问题中也有链接):http://waynepan.com/2007/10/11/how-to-use-ignore_user_abort-to-do-process-out-of-band/

希望有所帮助。

答案 1 :(得分:0)

我认为你正在寻找$.done()