【问题标题】:Why is ajax call in window.unonload never called?为什么从未调用 window.onload 中的 ajax 调用?
【发布时间】:2014-07-30 22:51:35
【问题描述】:

我有一个用 Angularjs 编写的上传视图。我想确保在上传期间页面是否重新加载关闭;为保持一致性,应删除所有上传到服务器的文件。所以我尝试如下:

// this function is under /upload view, and inside UploadController
window.onunload = function () {
   $http.delete(...call delete on my server..);
};

但是,DELETE 没有到达服务器,我错过了什么?

【问题讨论】:

  • onunload 事件可能会触发,但它不会以任何方式停止浏览器,它仍会重新加载页面,因此无法保证 ajax 调用会在页面重新加载之前完成,这就是为什么通常不这样做,它往往会失败。
  • 但我不等待任何结果,只是如你所见那样触发它,没有回调。有什么解决方法吗?
  • 仍然无法保证会发送任何内容。您是否在其中放置了一个 console.log 以查看是否发生火灾?
  • 您是否考虑过在上传的完成事件中添加最终的 ajax 调用?在服务器上,您可以查找完成回调以“保留”文件。
  • @anvarik 您正在等待结果...您正在进行 HTTP 调用。仅仅因为您的代码不关心响应是什么,因此底层调用必须如此。即使它在响应之前退出,它也可能在网络连接建立之前退出。

标签: javascript ajax angularjs


【解决方案1】:

我以前也遇到过这个问题。打开浏览器控制台并转到网络选项卡。现在离开页面。您会很快看到您的 ajax 请求被标记为(canceled),因为浏览器会在您离开时取消该请求。

我在 google chrome 中观察到了这种行为,并且没有检查过其他浏览器,但如果它在最流行的浏览器之一中不能可靠运行,那么你知道这不是一个可靠的解决方案。

基本上,没有可靠的方法来做到这一点。我发现即使在window.onbeforeunload 中进行 ajax 调用也不可靠。

如果我是你,我会在你上传的文件上设置一个过期日期,并有一个 cron 作业在过期日期后删除它们。即使window.onunload 有效,它仍然不是一个可靠的解决方案——例如,当用户的机器意外关闭时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多