【问题标题】:Javascript synchronous AJAX timeoutJavascript 同步 AJAX 超时
【发布时间】:2011-01-19 09:17:34
【问题描述】:

当页面关闭时,我的 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();
  }
}

这行得通吗?这种方法有什么潜在的问题吗?

【问题讨论】:

  • 我个人觉得整个方法可能需要改变。窗口关闭事件很棘手,在一个浏览器上工作的东西肯定会在另一个浏览器上中断。你能告诉我们更多关于你的目标吗?然后有人可能会提出不同的方法。

标签: javascript ajax asynchronous onbeforeunload


【解决方案1】:

您的问题是浏览器冻结,您正试图通过手动循环冻结浏览器来解决它。这也会冻结 UI 线程,所以这不是一个潜在的问题,而是一个明确的问题。

由于浏览器正在关闭,我想您不需要从 AJAX 响应中接收任何反馈来更新正在关闭的页面?在这种情况下,也许您可​​以通过将IMG 标记注入到隐藏的DIV 中来解决您的问题,并将它们的src 属性设置为您要请求的URL。

【讨论】:

  • 如果“图像”位于隐藏的 div 并且窗口/选项卡正在关闭,浏览器是否仍会获取它?
  • 我想它可能会。但是您必须自己进行实验才能确定,我从来没有理由自己尝试。
猜你喜欢
  • 2020-10-31
  • 2011-01-12
  • 1970-01-01
  • 2013-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多