停止AJAX XHR调用,但仍继续使用PHP

时间:2019-01-17 13:16:22

标签: javascript php ajax xmlhttprequest

下午好,

我具有以下功能来显示和隐藏页面繁忙的加载器:

busyStatusDelay = 1000; //milliseconds
var timer = null;
var show = false;

function busyShow(nodelay,delay) {
    timer = setTimeout('busyDelayShow()',busyStatusDelay);
}

function busyDelayShow() {
    if ($.active > 0) {
        $('#json-overlay').css('display', 'table');
        show = true;
    }
}

function busyHide() {
    clearTimeout(timer);
    timer = null;
    show = false;
    $('#json-overlay').css('display', 'none');
}

这对于普通的ajax查询非常有用,但是我们有一个新功能,该功能应该使用SMTP发送电子邮件,但是此SMTP连接需要花费几秒钟的时间才能连接和发送电子邮件。

为避免这种情况,我希望ajax函数不触发此加载器,该函数不调用该函数来打开加载器,但问题是,当调用另一个应打开加载器的函数时,它会在此处找到是活动的连接,因此加载程序会重新启动并且不会消失。

我尝试使用以下内容,以便JS不会将其视为活动请求:

xhr.abort(); busyHide();

但是当ajax中止时,php随之中止。

请注意,发送电子邮件的功能应在后台运行,并且不应等待响应。

我一直在寻找一种与服务器请求断开连接的方式,而又不影响服务器的运行功能和发送电子邮件。

我在另一篇文章中看到了ignore_user_abort,因此将对此做一些阅读,以了解这是否会起作用而不影响系统的其余部分。

提前感谢您继续操作的提示!

1 个答案:

答案 0 :(得分:0)

一种好的方法是使用某种排队机制将SMTP作为后台进程执行。因此,基本上,每当JS触发AJAX发送邮件时,PHP会将电子邮件请求推送到队列中,然后立即将响应发送回XHR。这样,您的AJAX执行不会被长时间阻止。 如果您使用的是Laravel之类的PHP框架,则可以更轻松地管理队列,否则请查看this post.