下午好,
我具有以下功能来显示和隐藏页面繁忙的加载器:
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
,因此将对此做一些阅读,以了解这是否会起作用而不影响系统的其余部分。
提前感谢您继续操作的提示!
答案 0 :(得分:0)
一种好的方法是使用某种排队机制将SMTP作为后台进程执行。因此,基本上,每当JS触发AJAX发送邮件时,PHP会将电子邮件请求推送到队列中,然后立即将响应发送回XHR。这样,您的AJAX执行不会被长时间阻止。 如果您使用的是Laravel之类的PHP框架,则可以更轻松地管理队列,否则请查看this post.