3

我有一个异步函数(关闭套接字),当用户离开页面时我必须执行它。我试图通过 jQuery 做到这一点:

$(window).unload(function() {
   socket.disconnect();
});

但是,这不起作用,因为该函数是异步的,并且客户端一到达方法的末尾就离开页面,也就是说立即并且不执行断开套接字的请求。

socket.disconnect()我们可以提供在函数执行结束时执行的回调。也许这可以帮助...

javascript中有没有办法解决这个问题?

4

5 回答 5

3

我会伸出脖子说我不相信这是可行的 - 至少不是跨浏览器。

正如有人建议的那样,您可以通过中断导航,onbeforeunload但这不是在同一个跨浏览器中实现的,即使您可以中断它,您也无法(我相信)捕获用户的去向,例如,在您的套接字关闭中回调,然后您可以转发它们。

一个不理想的妥协可能是用于onbeforeunload至少提示他们手动断开与服务器的连接。许多人会;那些没有的你可以通过服务器端检测来获取。

于 2012-07-31T09:11:58.513 回答
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.

于 2012-07-31T09:08:20.477 回答
0

它现在可以在我的本地版本中使用,因为我已降级到 socket.io 0.9.4。这确实是一个错误。现在它也不适用于我的主机(Heroku),它也有 0.9.4 版本(我配置了它)。

我不知道该怎么做才能解决这个问题,但是是的,至少它在本地工作......

于 2012-07-31T12:37:57.963 回答
0

也许您可以尝试使用“beforeunload”事件而不是“unload”,就像那里一样,但我认为没有办法通过另一种方式延迟窗口关闭。

于 2012-07-31T09:04:58.440 回答
0

看看我有一个类似的问题,原来socket.iofrom 0.9.5to有一个错误0.9.9

这是我的问题的链接。希望这可以帮助。

于 2012-08-28T02:20:01.753 回答