我想知道是否有一种取消AJAX请求的简单方法?
除了在客户端调用XMLHTTPRequest上的'abort'之外,有没有办法轻松停止服务器进程?服务器正在使用Apache。
由于
答案 0 :(得分:7)
没有。绝对没有简单的方法。
我可以想到一些复杂的方法,但它们是不可靠的。
你可能会有更多的运气来开发一个逆转来自你刚刚运行的请求的变化的过程(我假设这是你想要阻止它的原因。)
答案 1 :(得分:4)
启动另一个Ajax请求。我通过试图弄清楚如何防止先前的请求在另一个请求被中断时找到了这个线程。
答案 2 :(得分:1)
没有好的方法可以通过网络停止请求本身(正如许多人所说的那样),但是停止请求的影响相对容易。即。
在服务器端:你可以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
答案 3 :(得分:0)
最简单的方法是发送503(或类似的)HTTP Response头并中止服务器端应用程序(或者只是中止应用程序)。假设没有发送数据和/或您检查了HTTP响应头客户端,您可以将其视为失败的请求。
答案 4 :(得分:0)
简短的回答是“不”。除非你在服务器端谈论一个非常长时间运行的后台进程,否则你可以在第二个Ajax请求中启动停止。但是,如果您正在讨论对Apache / PHP服务器的常规请求,那么没有...确定您的请求运行的Apache线程是否足够麻烦。
在启动流程之前以某种方式验证Ajax请求要容易得多;确保它是你想要运行的。如果您需要用户意识到他们正在做的事情不会被中断,您也可以拥有Javascript确认流程。
正如史蒂文所说,进行逆转过程听起来似乎也符合你的最佳利益。
答案 5 :(得分:0)
如何发送另一个Ajax请求,该请求会更改由该长进程监视的特定$_SESSION
var?
答案 6 :(得分:0)
对于PHP,我找到了一种使用session_write_close();
停止或中止的方法。只需将session_start()
放在脚本上即可。如果您正在使用framwework或OOP,请将其保留为方法的第一行。这是因为会话数据被锁定,直到ajax完成。
经测试&看到另一页现在正在xhr.abort()
此处找到解决方案提示 Abort Ajax requests using jQuery