摘要:
如果客户端在返回响应之前取消请求(关闭浏览器/选项卡、刷新页面等(,我希望回滚数据库更改。
我的案例:
我正在后台创建一个视图,这个视图是非常私人的,它是根据请求创建的,数据库中的一个实体是根据每个请求创建的。它保存用户创建这个视图和离开它的日期。
我使用WebSocketonClose
来确定客户端是否关闭了他的页面,如下所示:
- 客户端发出HTTP请求以创建页面
- 客户端等待大约2秒,直到创建页面(一些数据保存在数据库中,关于创建该页面的时间、包含的内容等(
- 响应将返回给客户端
- WebSocket随后被初始化
- 现在,如果客户端关闭页面,WebSocket
onClose
将被触发,并指示用户何时离开页面
一切都很好!直到我注意到一些客户查看了页面,但从未离开过它!我进一步调查发现,他们发出了创建页面的HTTP请求,在返回响应之前,他们就发出了大量的请求,因此,页面被创建了,但WebSocket从未初始化!
我想到的解决方案是在返回响应之前检查用户是否已经完成了请求,然后数据库更改应该回滚(有更好的解决方案吗?(。
代码语言
我使用PHP(Laravel(和MySql作为数据库。
我建议等待web套接字准备好/初始化,然后通过HTTP请求请求页面并最终呈现。
但是,除了您当前的解决方案外,还可以使用onbeforeunload事件,如:
window.addEventListener('beforeunload', abort, false);
function abort(e) {
// code to abort
socket.close();
}
通过此事件,您可以捕捉到关闭选项卡或浏览器的情况。