【发布时间】:2010-10-22 10:22:45
【问题描述】:
我想知道是否有一种简单的方法可以取消 AJAX 请求?
除了在客户端调用 XMLHTTPRequest 的“中止”之外,有没有办法轻松停止服务器进程?服务器正在使用 Apache。
谢谢
【问题讨论】:
标签: php ajax request-cancelling
我想知道是否有一种简单的方法可以取消 AJAX 请求?
除了在客户端调用 XMLHTTPRequest 的“中止”之外,有没有办法轻松停止服务器进程?服务器正在使用 Apache。
谢谢
【问题讨论】:
标签: php ajax request-cancelling
对于 PHP,我找到了一种使用 session_write_close(); 停止或中止的方法。只需将其放在脚本上的 session_start() 之后即可。如果您使用的是框架或 OOP,请将其保留为方法的第一行。发生这种情况是因为会话数据在 ajax 完成之前被锁定。
测试并看到在xhr.abort() 之后正在加载另一个页面
在此处找到解决方案提示 Abort Ajax requests using jQuery
【讨论】:
如何发送另一个 Ajax 请求来更改特定的 $_SESSION var,它由那个漫长的过程监控?
【讨论】:
没有什么好的方法可以通过网络阻止请求本身(正如许多人所说),但是阻止请求的影响相对容易。即
在服务器端:您可以exit(或您需要终止脚本的任何术语)通过不断检查全局变量(充当标志),如 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
【讨论】:
发起另一个 Ajax 请求。我通过试图弄清楚如何防止先前的请求在另一个请求被调用时被中断而找到了这个线程。
【讨论】:
简短的回答是“不”。除非您在服务器端谈论一个运行时间很长的后台进程,在这种情况下,您可以让第二个 Ajax 请求在其上启动停止。但是,如果您谈论的是对 Apache/PHP 服务器的常规请求,那么不...确定您的请求在哪个 Apache 线程中运行就够麻烦了。
在开始流程之前以某种方式验证您的 Ajax 请求会容易得多;确保它是你想要运行的。如果您需要用户知道他们正在做的事情不能被打断,您也可以有一个 Javascript 确认过程。
正如 Steven 所说,有一个逆转过程听起来也可能符合您的最大利益。
【讨论】:
最简单的方法是发送 503(或类似的)HTTP 响应标头并中止服务器端应用程序(或只是中止应用程序)。假设没有发送数据和/或您检查了客户端的 HTTP 响应标头,您可以将其视为失败的请求。
【讨论】:
没有。绝对没有简单的方法。
我能想到一些复杂的方法,但它们并不可靠。
您可能会更幸运地开发一个流程来逆转您刚刚运行的请求的更改(我假设这就是您想要停止它的原因。)
【讨论】: