Ajax调用挂起浏览器 - 我不关心回应

问题描述:

如果我不真正关心响应,我不想挂上浏览器,我该如何中止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消息。

当服务器继续做这件事情时,我该如何静静地忽略20secs之后的响应?

+0

Ajax调用是异步的,所以你的浏览器不会被阻塞,也不需要等待任何东西。你可以放空成功。即使你在浏览器中离开,你的服务器脚本已经启动,并可以使用'ignore_user_abort'和一个好的'set_time_limit'来完成它的工作:) – MatRt 2013-04-25 21:40:50

在这篇文章中有当场打死办法keet http请求后运行脚本结束:

Can a PHP script start another PHP script and exit?

所以你可以让你的电子邮件脚本在服务器上运行。

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

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

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

+0

服务器在这里完成繁重的工作,所有的Ajax调用确实是发送电子邮件的内容,并且我已经在群发电子邮件发送之前尝试了响应,例如,在PHP中: '//报告一切正常! echo'emailSuccess'; //发送...... $ this-> send_newsletter($ email_data,$ subscribers); } else { echo'Fail'; } die();' – sw19womble 2013-04-25 21:54:38

+0

但不是立即发送电子邮件,您也可以将它们存储在数据库中并使用cron作业批量发送。另请注意,PHP的mail()函数并不是发送大量电子邮件的最佳工具。 – Arjan 2013-04-25 21:58:16

只需发布而不使用成功,超时或错误回调。

你可能想尝试创建为每个电子邮件新的GET请求:

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'} 

    }); 

}); 
+0

我试过这个,但浏览器仍然挂起,直到所有的电子邮件都在服务器上发送。 – sw19womble 2013-04-25 21:53:15