如果我提出 AJAX 请求,它将显示在 Chrome 的网络选项卡中。如果我同时进行基于客户端的重定向,AJAX 请求将被取消。但是请求会到达服务器并正常执行吗?HTTP/TCP 中是否知道客户端已取消请求?我不这么认为,但我想确定一下。
2 回答
如果您在服务器端运行 PHP,它将在客户端中止时停止处理。(根据我的阅读,其他服务器端技术并非如此,它会在客户端中止后继续处理。)请参阅:
http://php.net/manual/en/features.connection-handling.php
但是,最好不要以某种方式假设任何事情。浏览器可能会取消请求。并且这种取消可能会发生在服务器端停止处理的时间。但是,情况不一定如此。客户端可以在请求期间的任何阶段取消 - 从实际发送请求之前到发送响应正文之后。还要记住,还有其他一些事情会中断服务器端的请求处理(硬件、电源、操作系统故障等)。期待一些不可预测性。
由此,我提出两个建议:
编写代码尽可能保证事务安全。如果请求进行了数据更改,请在所有更改都通过管道传输到数据库之前不要提交它们。如果您的应用程序依赖多个 AJAX 请求来更改某些数据,请不要提交任何更改,直到“最终”AJAX 请求结束。
即使请求完成,也不要假设客户端会收到响应。在我的脑海中,这意味着如果您的应用程序是 AJAX-heavy,请始终依赖客户端状态来告诉服务器它拥有什么信息,而不是依赖服务器端状态来假设客户端“知道”某些东西。
async: false
这是同步请求(在$.ajax(...)
选项中)适用的少数情况之一。这通常可以避免浏览器在请求完成之前导航到其他页面。