我的 Javascript 需要在页面关闭时向服务器发送一些数据,目前我在 window.onbeforeunload
中使用同步 AJAX(SJAX?)请求来执行此操作。当然,这样做的问题是,如果我的服务器花费的时间太长或网络连接中断,浏览器就会卡住。
据我所知,不可能为同步 AJAX 请求指定超时,并且异步 AJAX 请求不适用于 window.onbeforeunload
。我对如何解决这个问题的最佳猜测是使用异步请求,然后将浏览器锁定一段时间以让请求完成:
window.onbeforeunload = function() {
doSomeAjax(); // asynchronous request
var now = new Date();
var time_limit = now.getTime()+2000; // 2,000 ms
while(now.getTime() < time_limit) {
now = new Date();
}
}
这行得通吗?此方法是否存在任何潜在问题?
最佳答案
您的问题是浏览器死机了,您正试图通过在循环中手动卡住浏览器来解决这个问题。这也会卡住 UI 线程,因此这不是潜在问题,而是确定的问题。
由于浏览器正在关闭,我想您不需要从 AJAX 响应接收任何反馈来更新正在关闭的页面?在这种情况下,也许您可以通过将 IMG
标签注入(inject)到一个隐藏的 DIV
中来解决您的问题,并将它们的 src
属性设置为您要请求的 URL。
关于Javascript 同步 AJAX 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2306715/