Что происходит под капотом, когда я делаю асинхронный вызов XMLHttpRequest в событии "onbeforeunload"? - PullRequest
1 голос
/ 27 октября 2019

Вариант использования:
Я хочу надежно инициировать 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 () ждет так долго, пока ответ сервера не станет доступен.

1 Ответ

0 голосов
/ 30 октября 2019

После небольшой речерчи я думаю, что понимаю, что происходит под капотом. Причина того, что мой код иногда работает надежно - это только удача. Асинхронный код поступает в очередь обратного вызова, и, возможно, у интерпретатора JavaScript есть время для его выполнения или нет. См. Также здесь: Какие ограничения используются перед событием unload?

Для моего случая использования я также нашел информацию. Для этого он дает 2 альтернативы:

  1. Да, BeaconAPI, но с ограничением (например, настраиваемые заголовки)
  2. Сохранение активности извлечения, но также с ограничением (например, без IE или Safari) ив моем случае нет Chrome, потому что нет предполетной поддержки (https://bugs.chromium.org/p/chromium/issues/detail?id=835821#c1)
...