0

如果我因为不想挂起浏览器而不真正关心响应,如何中止 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 秒后安静地忽略响应?

4

3 回答 3

0

如果您要发送 1000 封电子邮件,那么无论您做什么,该电话都会包含一些开销。您还必须等到所有信息都发送到服务器之后才能允许用户离开页面。

我的建议是更改服务器代码以在服务器收到请求后立即响应。这样,客户端就不会在服务器上等待完成整个批次的发送,而只是等待服务器接收到他们的请求。

于 2013-04-25T21:41:14.590 回答
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'}

    });

});
于 2013-04-25T21:41:32.840 回答
0

在这篇文章中,有几种方法可以让脚本在 http 请求结束后继续运行:

PHP 脚本可以启动另一个 PHP 脚本并退出吗?

因此,您可以让您的电子邮件脚本在服务器上运行。

如果您想知道状态,您可以让您的电子邮件脚本更新到 mysql 表发送了多少电子邮件,并使用 ajax 请求检查 mysql 表中的计数。

于 2013-04-25T21:56:57.700 回答