强制javascript代码同步

时间:2012-07-31 08:59:32

标签: javascript websocket

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

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

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

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

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

5 个答案:

答案 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.io0.9.50.9.9有一个错误。

Here's我的问题的链接。希望这会有所帮助。