Как я могу отправить запрос на сервер, когда пользователь закрывает / обновляет браузер? - PullRequest
0 голосов
/ 25 апреля 2019

Чего я пытаюсь достичь:

У меня есть лобби, которое обновляется автоматически, поэтому, если кто-то из игроков уходит, другие могут его увидеть сразу.Когда игрок выходит из игры, я отправляю запрос бэкэнду, чтобы выгнать его из лобби, и после этого я «тыкаю» лобби, оставленное игроком, используя сокеты, чтобы это лобби могло обновляться и отображать фактический список игроков.

Моя проблема

Я понятия не имею, что делать, когда один из игроков в лобби закрывает вкладку / браузер, обновляет или вводит адрес какого-либо веб-сайта.Сначала я хотел использовать событие 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
    }
  }

1 Ответ

1 голос
/ 25 апреля 2019

Поскольку вы используете веб-сокеты, вы можете проверять каждого пользователя через регулярные промежутки времени, чтобы убедиться, что он в данный момент онлайн. Это было бы более подходящим для следующих вариантов использования:

  • Пользователь может просто перезагрузить страницу. В этом случае нет необходимости показывать ему диалоговое окно подтверждения или выгнать его из чата, потому что он вернется.
  • Его браузер может неожиданно закрыться (например, сбой браузера или использование мобильного браузера, он может выйти из приложения браузера в любое время и т. Д.)

В противном случае, насколько мне известно, выполнить задачу такого рода невозможно только с помощью JavaScript (то есть с помощью события beforeunload и т. Д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...