Javascript 当链接被点击时,AJAX请求是否被终止?

Javascript 当链接被点击时,AJAX请求是否被终止?,javascript,jquery,ajax,Javascript,Jquery,Ajax,我有一个带有AJAX购物车的网站。这个概念非常简单:你在一个页面上看到一个产品,你可以点击Buy Now按钮。当您这样做时,JavaScript代码将产品添加到购物车中,使用新的计数更改购物车的可视性,并向服务器发送一个AJAX请求以报告更改 我想知道的是,由于客户端和服务器可能需要一段时间来处理AJAX请求,所以。。。在AJAX被报告为成功之前,客户端是否会单击一个链接移动到另一个页面(即“下一个产品”),从而停止AJAX请求 // prepare request... ...snip...

我有一个带有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请求,客户机和服务器都能更好地工作

在评论中对这一点进行了很好的总结


当浏览器离开页面时,任何挂起的AJAX请求都将被中止

因此,根据您如何定义“终止”AJAX请求,这意味着该请求可能已启动,但也可能尚未完成。如果它是一个短请求,很可能在完成时不会被中止。但是如果这是一个很长的请求(大量的数据处理,需要一两秒完成),那么很有可能在中间某个地方中止。

当然,这一切都取决于浏览器。问题通常是请求发送到服务器,但浏览器在响应通过之前中止请求。这完全取决于服务器及其处理数据的方式

视图的某些服务器,其中正在处理请求数据并生成响应。许多服务器只会让代码运行,并在运行时触发错误。这是因为另一端没有人,所以您正在编写对封闭连接的响应

尽管如果用户单击外部链接,我能想到的保存该数据的唯一解决方案实际上是
卸载

根据我自己的经验,大多数浏览器都允许您在卸载前发出请求。不过,对于
卸载
而言,情况并非总是如此,因为此时页面会发生变化


解决这个问题的一种方法,尤其是当响应很重要时,就是在用户单击链接后停止页面更改。这非常简单,只需在链接的
单击事件上调用
evt.preventDefault()
,然后在请求完成后将用户重定向到他们想要去的地方。您应该确保向用户指出,他们的请求不仅被忽略,而且他们正在等待一些事情首先完成。用户不希望被蒙在鼓里,因此请确保向他们提供一些反馈(如更改按钮文本、禁用按钮文本等)。

当浏览器离开页面时,任何挂起的AJAX请求都将被中止。在卸载事件中启动请求为时已晚。离开页面会中止请求,卸载不会等待请求。AJAX中有一个字是异步的。您似乎在描述一个模态对话框,它几乎是同步的。你不能两全其美。你能做的就是把对服务器的请求和响应分开。也就是说,让
Buy Now
点击服务器,服务器会立即响应,并在一个单独的线程中将内容添加到后端的购物车中。完成后,您可以使用类似signar的方式通知浏览器新购物车的内容,这将独立轮询服务器。对于定时请求,同样的事情是:在服务器端实现延迟。基本上,您永远不会返回需要很长时间才能在后端完成的AJAX请求的结果,您可以使用独立的机制更新UI。另一种选择是使用AJAX替换网页内容,这样就不会发生页面重新加载,但这可能比之前的建议更费劲。是的,我一直在考虑在购物车中放置一个转折点,表示它当前正在与服务器一起工作。但这本身不会阻止用户单击链接(可能是外部链接)或关闭窗口/选项卡。我想我可以研究捕捉所有点击,如果购物车(或其他任何东西)没有完成,灰色的窗口,直到它完成。。。这样,我还可以显示一条消息来解释问题。但是,不应该阻止对购买按钮和其他许多按钮的额外点击。。。值得深思。