我有一个异步函数(关闭套接字),当用户离开页面时我必须执行它。我试图通过 jQuery 做到这一点:
$(window).unload(function() {
socket.disconnect();
});
但是,这不起作用,因为该函数是异步的,并且客户端一到达方法的末尾就离开页面,也就是说立即并且不执行断开套接字的请求。
socket.disconnect()
我们可以提供在函数执行结束时执行的回调。也许这可以帮助...
javascript中有没有办法解决这个问题?
我有一个异步函数(关闭套接字),当用户离开页面时我必须执行它。我试图通过 jQuery 做到这一点:
$(window).unload(function() {
socket.disconnect();
});
但是,这不起作用,因为该函数是异步的,并且客户端一到达方法的末尾就离开页面,也就是说立即并且不执行断开套接字的请求。
socket.disconnect()
我们可以提供在函数执行结束时执行的回调。也许这可以帮助...
javascript中有没有办法解决这个问题?
我会伸出脖子说我不相信这是可行的 - 至少不是跨浏览器。
正如有人建议的那样,您可以通过中断导航,onbeforeunload
但这不是在同一个跨浏览器中实现的,即使您可以中断它,您也无法(我相信)捕获用户的去向,例如,在您的套接字关闭中回调,然后您可以转发它们。
一个不理想的妥协可能是用于onbeforeunload
至少提示他们手动断开与服务器的连接。许多人会;那些没有的你可以通过服务器端检测来获取。
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
.
它现在可以在我的本地版本中使用,因为我已降级到 socket.io 0.9.4。这确实是一个错误。现在它也不适用于我的主机(Heroku),它也有 0.9.4 版本(我配置了它)。
我不知道该怎么做才能解决这个问题,但是是的,至少它在本地工作......
也许您可以尝试使用“beforeunload”事件而不是“unload”,就像那里一样,但我认为没有办法通过另一种方式延迟窗口关闭。
看看我有一个类似的问题,原来socket.io
from 0.9.5
to有一个错误0.9.9
。
这是我的问题的链接。希望这可以帮助。