А других официальных вариантов и нет. Только синхронно.
Перед закрытием дергается
onbeforeunload
, в котором вы что-то делаете, и далее,
после передачи управления, никаких гарантий существования страницы больше нет. То есть в случае асинхронного запроса ответ может вернуться в никуда или быть прерванным.
Более правильно не выполнять запрос вообще. Вместо этого нужно записать куда-нибудь в куки или localStorage информацию, и при следующем посещении сайта отправлять её туда-сюда, сколько угодно раз. Если же нужно детектить именно само закрытие, то можно раз в N секунд делать ajax или другим способом поддерживать соединение, и по таймауту считать пользователя "отвалившимся".
Код, который может помочьwindow.addEventListener("beforeunload", e => {
if (is_test_passed) {
return;
}
let message = "Вы уверены, что хотите закончить тест?";
if (typeof e == "undefined") {
e = window.event;
}
if (e) {
e.returnValue = message;
}
return message;
}