单击 link 时,AJAX 请求是否被终止?

Is an AJAX request killed when a link gets clicked?

我有一个带有 AJAX 购物车的网站。这个概念非常简单:您最终会进入一个包含产品的页面,然后可以单击 Buy Now 按钮。当您这样做时,JavaScript 代码将产品添加到购物车,使用新计数更改购物车视觉效果,并向服务器发送 AJAX 请求以报告更改。

我想知道的是,由于客户端和服务器可能需要一段时间来处理 AJAX 请求,所以...客户端是否会单击 link 以移动到另一个在 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 请求。如果用户在这些定时请求发生之前单击 link,则它们肯定会丢失。假设点击没有取消 AJAX 请求,那么在 unload 事件中启动一个请求是否可行?使用 cookie better/safer 会比尝试另一个 AJAX 请求好吗? (尽管如果用户单击外部 link,unload 确实是我能想到的唯一保存该数据的解决方案...)

附带说明:当用户将商品添加到购物车时,我不想让屏幕变暗,这样用户就可以继续做事……但是如果 AJAX 需要在可以点击 link 之前进行确认,我必须确保在此之前不能使用点击。


更新:

我认为你们中的一些人没有抓住重点。我不关心在客户端调用 done()completed() 函数。我关心的是确保最终我获得服务器上的所有数据。

我知道这是异步的,但我想确保避免数据丢失,特别是如果 link 转到另一个网站(到同一个网站,我真的想利用一个 cookie,以确保延迟 AJAX 请求的数据无论如何都能到达服务器。)

此外,定时数据请求的想法是避免服务器负载过重。通过适当定时的一组 AJAX 请求,客户端和服务器都工作得更好!

@meagar 在评论中总结得很好

Any pending AJAX requests will be aborted when the browser navigates away from the page.

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

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

一些服务器will interrupt the execution of your view, where the requests data is being processed and the response is being generated. Many servers will just let the code run and trigger an error when you 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.

解决此问题的一种方法是在用户单击 link 后停止页面更改,尤其是当响应很重要时。这可以像在 link 的 click 事件上调用 evt.preventDefault() 一样简单,然后在请求完成后将用户重定向到他们想去的地方。您应该确保向用户表明他们的请求不仅被忽略了,而且他们正在等待某些事情先完成。用户不想被蒙在鼓里,所以一定要给他们一些反馈(比如更改按钮文本、禁用按钮等)。