我有一个带有 AJAX 购物车的网站。这个概念非常简单:您最终会进入一个包含产品的页面,然后可以单击 Buy Now
按钮。当您这样做时,JavaScript 代码将产品添加到购物车,使用新计数更改购物车视觉效果,并向服务器发送 AJAX 请求以报告更改。
我想知道的是,由于客户端和服务器可能需要一段时间来处理 AJAX 请求,所以...客户端是否会在AJAX 被报告为成功完全停止 AJAX 请求?
// prepare request...
...snip...
// send request (usually a POST)
jQuery.ajax(uri, ajax_options);
// return to user
// will a click on a link cancel the AJAX call after this point?
此外,我还对 AJAX 请求进行了计时。如果用户在这些定时请求发生之前单击链接,则它们肯定会丢失。假设点击没有取消 AJAX 请求,在 unload
事件中启动一个请求是否可行?使用 cookie 会比尝试另一个 AJAX 请求更好/更安全吗? (尽管如果用户单击外部链接,unload
确实是我能想到的保存该数据的唯一解决方案...)
作为旁注:当用户将商品添加到购物车时,我不想让屏幕变暗,这样用户就可以继续做事......但是如果 AJAX 需要在链接可以之前确认被点击,我必须确保在此之前无法使用点击。
更新:
我认为你们中的一些人没有捕获要点。我不关心客户端调用的 done()
或 completed()
函数。我真正关心的是确保最终我获得了服务器上的所有数据。
我知道这是异步的,但我想确保避免数据丢失,特别是如果链接转到另一个网站(到同一个网站,我真的想使用 cookie 来确保延迟的 AJAX 请求的数据无论如何都会到达服务器。)
此外,定时数据请求的想法是避免服务器负载过重。通过一组适当定时的 AJAX 请求,客户端和服务器都可以更好地工作!
最佳答案
@meagar在评论中总结得很好
Any pending AJAX requests will be aborted when the browser navigates away from the page.
因此,根据您定义“终止”AJAX 请求的方式,这意味着请求可能已开始,但也可能尚未完成。如果它是一个简短的请求,很可能它在完成时不会被中止。但如果这是一个很长的请求(大量数据处理,需要一两秒钟才能完成),那么它很可能会在中间的某个地方被中止。
当然,这完全取决于浏览器。问题通常是请求发送到服务器,但浏览器在响应通过之前中止了请求。这完全取决于服务器及其处理数据的方式。
一些服务器will interrupt the execution在您看来,正在处理请求数据并生成响应。当您 try to write output to the response 时,许多服务器只会让代码运行并触发错误.这是因为另一端没有人,所以您正在编写对已关闭连接的响应。
although if the user clicks an external link, the
unload
is really the only solution I can think of to save that data
根据我自己的经验,大多数浏览器都允许您在 beforeunload
事件期间发送请求。不过,对于 unload
来说,这并不总是正确的,因为那时页面会更改 cannot typically be stopped .
解决此问题的一种方法是在用户单击链接后停止页面更改,尤其是在响应很重要的情况下。这可以很简单,只需在链接的 click
事件上调用 evt.preventDefault()
,然后在收到请求时将用户重定向到他们想去的地方完成的。您应该确保向用户表明他们的请求不仅被忽略了,而且他们正在等待某些事情先完成。用户不想被蒙在鼓里,所以一定要给他们一些反馈(比如更改按钮文本、禁用按钮等)。
关于javascript - 单击链接时 AJAX 请求是否被终止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27894448/