用例:
我想在用户关闭浏览器时向后端触发可靠的 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?
对于我的用例,我还找到了信息。为此,它提供了两种选择:
- 是的,BeaconAPI,但有限制(例如自定义 header )
- 获取保持事件状态,但也有限制(例如没有 IE 或 Safari),在我的例子中没有 Chrome,因为没有预检支持 ( https://bugs.chromium.org/p/chromium/issues/detail?id=835821#c1 )
关于javascript - 当我在事件 "onbeforeunload"中进行异步 XMLHttpRequest 调用时,幕后会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58577425/