javascript - 当我在事件 "onbeforeunload"中进行异步 XMLHttpRequest 调用时,幕后会发生什么?

标签 javascript xmlhttprequest onbeforeunload

用例:
我想在用户关闭浏览器时向后端触发可靠的 POST 请求。只有请求成功。我不需要响应代码或类似的代码。重要提示:用户体验不会出现明显的延迟。

我的代码:

window.onbeforeunload = function () {
    var async = true;
    var xmlHttpRequest = new XMLHttpRequest();
    xmlHttpRequest.open('POST', URL, async);
    xmlHttpRequest.setRequestHeader(HEADERS);
    xmlHttpRequest.send(CONTENT);

    var start = new Date().getTime();
    while (new Date().getTime() < start + 500) {
    }
};

我的观察:
在我的系统上,代码在 Chrome 和 Edge 浏览器中“可靠”运行,但在 FireFox 和 IE 中只能部分运行。

我的问题:
1. 我的观察是否巧合?
2. 上面的代码底层发生了什么(EventLoop 等)以及请求何时被触发?
3. 有可靠的替代方案吗?

顺便说一句:同步 XMLHttpRequest 不是选项,因为 send() 等待很长时间直到服务器响应可用。

最佳答案

经过一番研究,我想我明白了幕后发生的事情。我的代码有时能够可靠运行的原因只是运气。异步代码进入回调队列,JavaScript 解释器可能有时间执行它,也可能不执行。另请参阅此处:What are the limitation using before unload event?

对于我的用例,我还找到了信息。为此,它提供了两种选择:

  1. 是的,BeaconAPI,但有限制(例如自定义 header )
  2. 获取保持事件状态,但也有限制(例如没有 IE 或 Safari),在我的例子中没有 Chrome,因为没有预检支持 ( https://bugs.chromium.org/p/chromium/issues/detail?id=835821#c1 )

关于javascript - 当我在事件 "onbeforeunload"中进行异步 XMLHttpRequest 调用时,幕后会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58577425/

相关文章:

javascript - 捆绑失败: Error: Requires Babel "^7.0.0-0"

javascript - 如何确保此 AJAX(登录)请求的安全

angular - 如何使用 @HostListener ('window:beforeunload' ) 调用方法?

javascript - jQuery beforeunload自定义离开页面弹窗

javascript - 打印图案的功能

javascript - 不对构造函数原型(prototype)方法使用 `new` 关键字会改变原始对象

javascript - HTML5 Canvas translate(0.5,0.5) 未修复线条模糊

javascript - 如何通过 Javascript formData API 发送变量

javascript - 使用 POST 请求但响应文本仍然不完整。为什么?

javascript - 防止 Gmail 关闭/保持可见