我有一个异步功能(关闭套接字),我必须在用户离开页面时执行。我试过通过jQuery做到这一点:
$(window).unload(function() {
socket.disconnect();
});
但是,这不起作用,因为该函数是异步的,并且客户端在到达方法结束时立即离开页面,即即时说明并且不执行断开套接字的请求。
我们可以提供在socket.disconnect()
函数执行结束时执行的回调。也许这可以帮助......
javascript中有没有办法解决这个问题?
答案 0 :(得分:3)
我要坚持下去,说我不相信这是可行的 - 至少不是跨浏览器。
正如有人建议的那样,你可以通过onbeforeunload
来中断导航,但这不是在同一个跨浏览器中实现的,即使你可以打断它,你也不能(我相信)捕获用户的去向这样,在你的套接字闭包回调中,你可以转发它们。
不理想的折衷方案可能是使用onbeforeunload
至少提示他们手动断开与服务器的连接。许多人会;那些没有你可以接受服务器端检测。
答案 1 :(得分:1)
window.onbeforeunload = function () {
socket.disconnect();
return 'This will disconnect all connections'; //Throws a prompt to user
};
更新:我没有看到这不起作用。
有没有办法强迫它同步?
大概..
var complete = false;
socket.on('disconnect', function () {
complete = true;
});
while(!complete){
//do nothing
}
就我而言,我做..
$.ajax({
async: false
});
适用于onbeforeunload
。
答案 2 :(得分:0)
也许您可以尝试使用“beforeunload”事件而不是“卸载”,例如there,但我认为没有办法以另一种方式延迟关闭窗口。
答案 3 :(得分:0)
它现在可以在我的本地版本中运行,因为我已降级到socket.io 0.9.4。这确实是一个错误。现在它不能在我的主机(Heroku)上运行0.9.4版本(我配置它)。
我不知道该怎么做才能解决这个问题但是,至少它可以在当地工作......
答案 4 :(得分:0)
看一下我遇到的类似问题,结果发现socket.io
从0.9.5
到0.9.9
有一个错误。
Here's我的问题的链接。希望这会有所帮助。