如何在用户离开(关闭)页面时发送 AJAX 请求


How to send AJAX request when user leaves (closes) the page?

情况

你好我正在制作一个数据库驱动的游戏,其中有一个问题,如果用户找到正确答案,他们有权更改问题(即编写新问题)。

但这有一个重要的问题,我认为它被称为竞争条件。问题是这样的:

  • 用户 1 找到答案
  • 系统提示用户 1 输入新问题
  • 在用户 1 提交新问题之前,用户 2 也会找到新答案
  • 现在只有运气,谁在提交新问题。如果用户 2 在用户 1 之后提交问题,则用户 2 的问题将覆盖用户 1 的问题。

现在,我已经通过使用某种信号量解决了这个问题,保持其timestamp。总结一下,它的工作原理是这样的:

  • 用户 1 找到答案
  • 信号量像['user_ip' = 'x.x' , 'time'='y.y' , 'locked'='true']一样保存到数据库中
  • 信号量在 t 秒后过期
  • 仅当信号量过期时,才会接受新问题。
因此,当

提交新问题时,仅当信号量锁定且当前时间比信号灯的日期大 t (15) 秒时,应用程序才会接受它。

但这也有一个问题,提示用户 2

"你已经找到了答案

,但有人在你之前找到了答案。您可以 如果他们在 15 中没有提交新问题,请更改问题 秒。

因此,新的获胜者必须等待15秒,也许是不必要的。

因此

我想做什么

我想提示"获胜者"一个表格,带有秒表(时间计数器)。当它达到零时,它会解锁信号量,以便新的获胜者可以提交他们的问题。

但是这个解决方案会有这个问题:

如果获胜者在时间计数器达到零之前关闭页面,则 AJAX 请求将永远不会完成,并且信号量将被无限期锁定。

因此,如果用户关闭页面,我必须确保已调用userLeave();函数。

谷歌建议onbeforeunloadonunload但人们也抱怨这些功能不起作用。那么,如果用户(获胜者)离开页面,是否有一种 100% 确定的方法可以发送此 AJAX 调用?

如果用户(入选者)离开页面,是否有 100% 确定的方法发送此 AJAX 调用?

永远不能100%依赖客户端做任何事情。想想网络连接丢失、浏览器崩溃、不可用的功能(从 HTML5 不兼容的浏览器到禁用的 javascript)、脚本错误、配置错误的代理以意想不到的方式调用(或不调用)您的 API,或者黑客故意做同样的事情......

您唯一可以期望客户端的就是他什么都不做 - 这称为超时。

如果希望信号量在特定时间过期,则必须创建计时器服务器端。如果需要,您还可以中止计时器,并在客户端发出不打算提交答案的信号(通过任何方式)时立即过期。如果要尝试捕获关闭页面,可以使用来自unload事件的同步 (A)JAX。

顺便说一句:虽然我不了解你的游戏,但如果你只是接受这两个新问题,它会更容易,也可能更舒服:-)