用例:当用户关闭浏览器时,我想向后端触发可靠的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.是否有可靠的替代方案?
BTW:同步XMLHttpRequest是不可选项,因为sends()等待很长时间,直到服务器响应可用。
经过一番摸索,我想我明白了幕后发生的事情。我的代码有时可靠运行的原因仅仅是运气。异步代码进入回调队列,并且JavaScript解释器可能有时间执行或不执行。另请参见此处:What are the limitation using before unload event?
对于我的用例,我也找到了信息。为此,它提供了两种选择: