当同步AJAX有意义时,我一直在寻找任何合理的情况示例。我发现了这个SO question,其中作者提到了window.onbeforeunload
并声称,"请求永远不会停止"如果AJAX调用是异步的。
有人可以解释一下吗?我的意思是 - 当用户想要关闭标签时会触发window.onbeforeunload
。即使有人点击关闭它,必须要使标签仍然存在?有人可以提供更具体的例子吗?
答案 0 :(得分:5)
他没有说请求永远不会停止;他说永远不会完成。也就是说,你的代码没有希望得到回复,因为执行环境(窗口)会在发生之前从存在中消失。
当window.onbeforeunload
以真实值退出时,标签将关闭。因此,只要它正在运行,页面就会等待返回值,而不是关闭。这允许发送同步AJAX,并且接收和处理响应。如果请求是异步的,则代码构造XHR对象,然后退出,页面(和代码)消失。
我从来没有对此进行过测试,但是应答者显然认为(并且我认为这不合理)页面可能不会长时间停留以使异步XHR甚至发送,让单独收到回复。因此,如果您想确保服务器收到用户关闭页面的信息,您希望请求同步。
答案 1 :(得分:0)
即使有人点击关闭它,必须要使标签仍然存在?有人可以提供更具体的例子吗?
在卸载时发送同步XMLHttpRequest
是保证在用户代理卸载页面时传递会话数据的唯一方法(并且可能永远不会再次访问您的站点)。有两个具体案例:
Beacon spec(navigator.sendBeacon
)旨在优化此特定情况,即使在页面卸载后也可以发送保证仍然完成的异步请求。