当单击链接时,是否会中止AJAX请求?

3
我有一个带有AJAX购物车的网站。概念非常简单:您在产品页面上可以点击“立即购买”按钮。当您这样做时,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请求,客户端和服务器都能更好地工作!

6
当浏览器离开页面时,任何未完成的AJAX请求将被中止。 - user229044
在卸载事件中开始请求太晚了。离开页面会中止请求,而卸载也不会等待请求。 - charlietfl
AJAX 中的一个单词是“异步”。您似乎正在描述模态对话框,这是最同步的方式。您不能两全其美。 - Robert Harvey
你可以将请求和响应分开处理。也就是说,让“立即购买”发送到服务器,服务器立即响应,并且在后台的一个单独的线程中将物品添加到购物车中。当完成时,你可以使用 SignalR 这样的机制通知浏览器新的购物车内容 - SignalR 会独立地轮询服务器。至于定时请求,同样的方法:在服务器端实现延迟。基本上,你永远不会返回在后端需要很长时间才能完成的 AJAX 请求结果,而是使用独立的机制更新 UI。 - millimoose
@meagar,所以如果浏览器的C/C++ send()或write()调用没有完成发送请求的所有数据,服务器将无法接收到它,对吗? - Alexis Wilke
显示剩余2条评论
1个回答

5

@meagar在评论中总结得很好:

当浏览器离开页面时,任何未完成的AJAX请求都将被中止。

因此,取决于您如何定义“终止”AJAX请求,这意味着该请求可能已经开始,但也可能尚未完成。如果是短请求,则大多数情况下不会在完成之前中止。但是,如果是长时间请求(处理大量数据,需要一两秒钟才能完成),则很可能会在中途中止。

当然,这都取决于浏览器。问题通常是请求已经到达服务器,但浏览器在响应到达之前中止了请求。这完全取决于服务器以及它如何处理数据。

一些服务器将中断执行您的视图,其中正在处理请求数据并生成响应。许多服务器将只允许代码运行,并在您尝试向响应写入输出时触发错误。这是因为没有人在另一端,因此您正在将响应写入关闭的连接。

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

根据我的经验,大多数浏览器允许您在beforeunload事件期间发送请求。但是对于unload而言并非总是如此,因为那时页面更改通常无法停止

解决此问题的一种方法,特别是当响应很重要时,是在用户单击链接后停止页面更改。这可以简单地在链接的click事件上调用evt.preventDefault(),然后在请求完成后将用户重定向到他们想要去的位置。您应该确保向用户指示他们的请求不仅被忽略了,而且他们正在等待某些内容完成。用户不想被置于黑暗中,因此请务必给他们一些反馈(例如更改按钮文本,禁用它等)。


是的,我一直在考虑在购物车中加入一个旋转的东西,表示它正在与服务器通信。但这本身并不能防止用户点击链接(可能是外部链接)或关闭窗口/标签页。我想我可以尝试捕获所有的点击事件,如果购物车(或其他任何东西)还没有完成,就将窗口变灰,直到它完成为止……这样我也可以显示一个解释问题的消息。但不应该阻止对“购买”按钮和可能许多其他按钮的额外点击……值得思考。 - Alexis Wilke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接