用户关闭/刷新浏览器时如何向后端发送请求?

时间:2019-04-25 16:49:54

标签: angular typescript web-applications onbeforeunload ondestroy

我要实现的目标:

我有一个会自动更新的大厅,因此如果有玩家离开,其他人可以立即看到它。玩家退出后,我发送一个后端请求,将其踢出大厅,然后我用套接字“戳”该玩家留下的大厅,以便该大厅可以自我更新并显示实际玩家列表。

我的问题

我不知道当大厅中的一名玩家关闭标签/浏览器,刷新或键入某些网站的地址时该怎么办。最初,我想使用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 个答案:

答案 0 :(得分:1)

由于使用Web套接字,因此可以定期检查每个用户,以查看他们当前是否在线。这样做将更适合以下用例:

  • 用户可以轻松地重新加载页面。在这种情况下,不必向他显示确认对话框或将他踢出聊天,因为他会马上回来。
  • 他的浏览器可能会意外关闭(例如,浏览器崩溃,或者如果他使用移动浏览器,则他可以随时退出浏览器应用程序,等等)

据我所知,否则,仅使用JavaScript(即通过beforeunload事件等)无法实现此类任务。