当发生“ onbeforeunload”事件时,我进行异步XMLHttpRequest调用时会发生什么?

问题描述 投票:1回答:1

用例:当用户关闭浏览器时,我想向后端触发可靠的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 xmlhttprequest onbeforeunload
1个回答
0
投票

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

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

  1. 是,BeaconAPI,但有限制(例如,自定义标题)
  2. 获取保持活动状态,但也有限制(例如,没有IE或Safari),在我的情况下也没有Chrome,因为没有预检支持(https://bugs.chromium.org/p/chromium/issues/detail?id=835821#c1]
© www.soinside.com 2019 - 2024. All rights reserved.