Да, вы можете использовать window.onbeforeunload
.Но вместо async/await
может потребоваться другая реализация debounce
или сделать это самостоятельно.Это может быть сделано с помощью debounce
, реализованным с использованием setTimeout
и хранящим таймер где-то глобально.В window.onbeforeunload
проверьте таймер и, если имеется, выполните требуемую логику.
Или вы можете попробовать использовать флаг, который указывает функцию в debouncing
.Например:
const isDebouncing = false;
const submitRecords = () => {
isDebouncing = true;
debounce(async () => {
isDebouncing = false;
await API.submit({ ...data })
// do other stuff here
}, 3000)();
}
window.onbeforeunload = () => {
if (isDebouncing) {
// do request
}
}
Примечание. Помимо одного флага, вы можете хранить и другие данные, относящиеся к await API.submit({ ...data })
.
Примечание: в некоторых случаях window.onbeforeunload требует предотвращения события и возвращаемого значения, например:
window.addEventListener('beforeunload', function (e) {
// Cancel the event
e.preventDefault();
// Chrome requires returnValue to be set
e.returnValue = '';
});
Описала ее: https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onbeforeunload