如果我不关心响应,我如何中止Ajax调用,因为我不想挂起浏览器?
情况是我有一个ajax调用,在某些情况下可能会触发服务器发送超过1000封电子邮件。 99%的时间它只是几封或几十封电子邮件。 因此,通过1000电子邮件ajax调用,浏览器有时会在获得成功消息之前等待5分钟,因此用户必须等待。
我已尝试设置超时,但这仍然会挂起。我想等待大约20秒然后中止等待响应。
var request = jQuery.ajax({
type: "post",url: "admin-ajax.php",
data: {
action: 'send_email',
emailHTMLMessage: tinyMCE.activeEditor.getContent(),
_ajax_nonce: '<?php echo $nonce; ?>'
},
timeout: 20000, //Set your timeout value
success: function(html){ //so, if data is retrieved, store it in html
window.scrollTo(0,0);
sendResults(html);
},
error: function(jqXHR, textStatus, errorThrown) {
if(textStatus==="timeout") {
<... I'd redirect to another html page here....>
} else {
alert("Another error was returned"); //Handle other error type
}
}
}); //close jQuery.ajax
我已经尝试过request.abort()但是这会立即杀死它,服务器永远不会收到send_email消息。
当服务器继续执行此操作时,如何在20秒后静静地忽略响应?
答案 0 :(得分:0)
如果你要发送1000封电子邮件,无论你做什么,这个电话都会包含一些开销。您还必须等到所有信息都发送到服务器之后才允许用户离开页面。
我的建议是更改服务器代码,以便在服务器收到请求后立即响应。这样客户端就不会在服务器上等待完成发送整个批处理,而只是等待服务器接收他们的请求。
答案 1 :(得分:0)
只需发布而不使用成功,超时或错误回调。
您可能想尝试为每封电子邮件创建新的获取请求:
for(i = 0; i<1000; i++){
var request = $.ajax({
type: "post",
url: "admin-ajax.php",
data: {'i':'nada'}
});
};
在这种情况下,我使用了for循环,但你也可以使用一组电子邮件:
var emails = new Array(1000);
$.each(emails, function(){
var request = $.ajax({
type: "post",
url : "admin-ajax.php",
data: {'i':'nada'}
});
});
答案 2 :(得分:0)
在这篇文章中,有一些方法可以在http请求结束后关闭脚本:
Can a PHP script start another PHP script and exit?
因此,您可以让您的电子邮件脚本在服务器上运行。
如果你想知道状态,你可以让你的电子邮件脚本更新到mysql表发送了多少封电子邮件,并用ajax请求检查mysql表中的计数。