Чего я пытаюсь достичь:
У меня есть лобби, которое обновляется автоматически, поэтому, если кто-то из игроков уходит, другие могут его увидеть сразу.Когда игрок выходит из игры, я отправляю запрос бэкэнду, чтобы выгнать его из лобби, и после этого я «тыкаю» лобби, оставленное игроком, используя сокеты, чтобы это лобби могло обновляться и отображать фактический список игроков.
Моя проблема
Я понятия не имею, что делать, когда один из игроков в лобби закрывает вкладку / браузер, обновляет или вводит адрес какого-либо веб-сайта.Сначала я хотел использовать событие beforeunload
, но мне удалось получить только подтверждение от пользователя, действительно ли он хочет уйти или нет.К сожалению, я не смог найти какую-либо информацию о том, как проверить действия пользователя (уйти или остаться).
@HostListener('window:beforeunload', ['$event'])
unloadNotification($event: any) {
// if shouldnt be closed ask for confirm
if (!this.canDeactivate()) {
$event.preventDefault();
$event.returnValue = true;
}
// it would be ideal for me if something like this was possible
// but according to what I have read so far, browsers dont allow checking user's response
// for this event
if(userDecidedToLeave){
this.cleanUp(); // sends request to backend to kick player from lobby
}
}
}
Тогда я решил пойти «легким путем» и просто пропустить подтверждение пользователя при выходе и простоиспользуйте ngOnDestroy()
, но либо ngOnDestroy()
не вызывается, когда пользователь закрывает вкладку / браузер, обновляет, вводит адрес какого-либо веб-сайта или невозможно отправить запросы с ngOnDestroy()
в этом сценарии.(или по какой-то другой причине, о которой я не мог думать).
ngOnDestroy() {
// if user left the lobby
if (!this.canDeactivate()) {
this.cleanUp(); // send request to backend to kick user from the lobby and then update lobby
}
}