如何取消已在服务器端运行的ajax请求

13

我想知道是否有一种简单的方法来取消 AJAX 请求?

除了在客户端上对 XMLHTTPRequest 调用 "abort" 之外,是否有一种更容易停止服务器进程的方法?服务器正在使用 Apache。

谢谢

7个回答

7

不,绝对没有简单的方法。

我可以想到一些复杂的方法,但它们很不可靠。

你可能会更有运气地开发一个过程来撤销你刚刚运行的请求所做的更改(我假设这是你想停止它的原因)。


原因是为了防止长时间的进程占用资源,与对数据库的修改无关。谢谢回复。 - AndreLiem
1
正如zombat在下面提到的,如果这是一个长时间的过程,你可能有时间去做一些事情,但是识别Apache线程将非常困难。你必须设置某种存储机制来将运行脚本与请求链接起来(这意味着请求需要包含某种唯一的ID)。如果你将这种关联存储在数据库中,你可以发送第二个请求来标记请求为取消,并定期轮询该数据库记录以查看是否可以停止工作。这将非常复杂,存在很多潜在的错误/恶意活动。 - Steven Richards

4

发起另一个Ajax请求。我通过尝试找出如何防止在调用另一个请求时中断先前的请求而找到了这个线程。


1

没有好的方法可以通过网络停止请求本身(正如许多人所说),但相对容易停止请求的影响。例如:

在服务器端:您可以通过不断检查充当标志的全局变量(如cookie或会话,假设这些在脚本执行期间会更改)来退出(或使用您需要的任何术语来终止脚本)。此外,您还可以将文件或数据库条目保留为标志(可以轮询其是否存在)。

在客户端:您可以调用abort(并非所有浏览器都适用,正如其他人所说),或者您可以在回调顶部保留全局信号量/标志(检查全局值以查看它是否仍应执行)。例如:

 window.ajaxIsStillGood = true;

 xhr.onreadystatechange = function( )
 {
     if( 4 === xhr.readyState && 200 === xhr.status )
     {
         if( true === window.ajaxIsStillGood ){ /* still good */ }
     }
 }

 /* bad stuff happens */

 window.ajaxIsStillGood = false; // now the code won't execute

1
对于PHP,我已经找到了一种使用session_write_close();停止或中止的方法。只需将其放在脚本中session_start()后面即可。如果您正在使用框架或OOP,则将其保留为您方法的第一行。这是因为会话数据在ajax完成之前被锁定。
测试并看到另一个页面现在正在加载后xhr.abort() 解决方案提示在这里找到 使用jQuery中止Ajax请求

0

你可以发送另一个 Ajax 请求来改变特定的 $_SESSION 变量,这个变量会被那个长时间运行的进程监控。


0
最简单的方法就是发送一个503(或类似的)HTTP响应头并中止服务器端应用程序(或仅中止应用程序)。假设没有发送任何数据和/或您在客户端检查了HTTP响应头,您可以将其视为失败的请求。

0
短答案是“不行”。除非你在谈论服务器端非常长时间运行的后台进程,否则你可以有第二个Ajax请求启动停止它。但如果你谈论的是对Apache/PHP服务器的常规请求,那么不行……识别你的请求正在运行的Apache线程已经够麻烦了。
在开始处理之前,验证你的Ajax请求会更容易一些;确保它是你想要运行的。如果需要用户知道他们所做的事情不能被中断,你也可以有一个JavaScript确认过程。
正如Steven发布的那样,拥有一个反转过程听起来也可能符合你的最佳利益。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接