Ajax Call挂起浏览器 - 我不关心响应

时间:2013-04-25 21:34:13

标签: php jquery ajax

如果我不关心响应,我如何中止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秒后静静地忽略响应?

3 个答案:

答案 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表中的计数。