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

情况

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

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

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

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

  • 用户1找到答案
  • 信号量被保存到数据库中,如['user_ip' = 'xx' , 'time'='yy' , 'locked'='true']
  • 信号量在t秒后到期
  • 只有在信号量过期时才会接受新问题。

因此,当提交新问题时,只有在信号量锁定且当前时间比信号量日期大t (15)秒时,应用程序才接受它。

但这也存在问题,提示用户2

“你找到了答案,但有人在你面前找到了答案。如果他们在15秒内没有提交新问题,你可以改变问题。”

所以新的胜利者必须等待15秒,可能不必要。

因此,

我想做的事

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

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

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

所以我必须确保我已经调用了userLeave(); 用户关闭页面时的function。

谷歌建议onbeforeunloadonunload但人们也抱怨这些function不起作用。 如果用户(胜利者)离开页面,是否有100%的方式发送此AJAX调用?

如果用户(胜利者)离开页面,是否有100%的方式发送此AJAX调用?

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

对客户唯一可以期待的是他什么都不做 – 这叫做超时。

如果您希望信号量在某个特定时间到期,则必须创建计时器服务器端。 如果你愿意,你可以另外中止计时器并在客户发出他不会提交答案时发出信号(以无论哪种方式)。 如果要尝试捕获关闭页面,可以使用unload事件中的同步(A)JAX。

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