如何在用户离开(关闭)页面时发送 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();
函数。
谷歌建议onbeforeunload
和onunload
但人们也抱怨这些功能不起作用。那么,如果用户(获胜者)离开页面,是否有一种 100% 确定的方法可以发送此 AJAX 调用?
如果用户(入选者)离开页面,是否有 100% 确定的方法发送此 AJAX 调用?
您永远不能100%依赖客户端做任何事情。想想网络连接丢失、浏览器崩溃、不可用的功能(从 HTML5 不兼容的浏览器到禁用的 javascript)、脚本错误、配置错误的代理以意想不到的方式调用(或不调用)您的 API,或者黑客故意做同样的事情......
您唯一可以期望客户端的就是他什么都不做 - 这称为超时。
如果希望信号量在特定时间过期,则必须创建计时器服务器端。如果需要,您还可以中止计时器,并在客户端发出不打算提交答案的信号(通过任何方式)时立即过期。如果要尝试捕获关闭页面,可以使用来自unload
事件的同步 (A)JAX。
顺便说一句:虽然我不了解你的游戏,但如果你只是接受这两个新问题,它会更容易,也可能更舒服:-)
- ajax请求的顺序总是不同的
- 从ajax请求中获取javascript对象
- Ajax请求文档就绪会导致jquery加载缓慢
- MockJax没有在JavaScript应用程序中发送对我AJAX请求的响应
- 正在传递JSONP标头's数据参数到另一个文件中的AJAX请求
- JavaScript代码未正确检查ajax请求
- node.js请求数据事件未在CORS ajax调用中触发
- jQuery Ajax GET请求工作不正常
- "日期“;AJAX请求返回的类型值未定义
- Django - 响应请求 AJAX
- 使用 jQuery 的 CORS 请求 - $.ajax()
- 如果无线电值为 ==1,则请求 ajax
- 如何处理对循环中发出的多个异步请求(AJAX 调用)的响应
- POST请求ajax jquery错误
- CasperJS don'我没有请求AJAX
- 使用这种Facebook风格的Lightbox-请求AJAX-在一个页面上覆盖多个按钮
- 400错误请求ajax post请求
- 如何在开始发送请求ajax之前延迟3秒
- 与jQuery同时请求AJAX
- 使用POST请求AJAX发送json对象