单击链接时是否会终止AJAX请求?

时间:2015-01-12 02:13:31

标签: javascript jquery ajax

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

1 个答案:

答案 0 :(得分:4)

@meagar在评论中很好地总结了这一点

  

当浏览器离开页面时,任何待处理的AJAX请求都将被中止。

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

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

视图的某些服务器will interrupt the execution,正在处理请求数据并生成响应。许多服务器只是让代码运行并在try to write output to the response时触发错误。这是因为是另一端没有人,所以你要将响应写入已关闭的连接。

  

虽然如果用户点击外部链接,unload实际上是我能想到保存该数据的唯一解决方案

根据我自己的经验,大多数浏览器都允许您在beforeunload事件期间发出请求。但unload并非总是这样,因为当时页面会更改cannot typically be stopped

解决此问题的一种方法,特别是在响应很重要时,是在用户单击链接后停止页面更改。这可以像在链接的evt.preventDefault()事件上调用click一样简单,然后在请求完成时将用户重定向到他们想要去的地方。您应该确保向用户表明他们的请求并未被忽略,但他们正在等待某些事情先完成。用户不希望被置于黑暗中,因此请务必向他们提供一些反馈(例如更改按钮文本,禁用它等)。