Reputation: 3826
I have an asynchronous funcion (closing a socket) that I have to execute when the user leaves the page. I've tried to do it through jQuery :
$(window).unload(function() {
socket.disconnect();
});
However, this doesn't work because the function is asynchronous and the client leaves the page as soon as it reach the end of the method, that's to say instantly and the request to disconnect the socket is not performed.
We can provide a callback executed at the end of the socket.disconnect()
function execution. Maybe this could help...
Is there a way in javascript to solve this ?
Upvotes: 3
Views: 2991
Reputation: 652
Take a look at a similar question I had, it turns out there was a bug in socket.io
from 0.9.5
to 0.9.9
.
Here's a link to my question. Hope this helps.
Upvotes: 0
Reputation: 3826
It now works in my local version because I have downgraded to socket.io 0.9.4. It was a bug indeed. Now it doesn't work on my host (Heroku) that has version 0.9.4 too (I configured it).
I don't know what to do to solve this but yay, at least it works in local...
Upvotes: 0
Reputation: 23074
window.onbeforeunload = function () {
socket.disconnect();
return 'This will disconnect all connections'; //Throws a prompt to user
};
UPDATE: I hadn't seen that this won't work.
Is there any way to force this to synchronous?
Probably..
var complete = false;
socket.on('disconnect', function () {
complete = true;
});
while(!complete){
//do nothing
}
In my case, I do..
$.ajax({
async: false
});
Which works fine with onbeforeunload
.
Upvotes: 1
Reputation: 34566
I'm going to stick my neck out and say that I don't believe this is viable - at least not cross-browser.
As one suggested, you can interrupt navigation via onbeforeunload
but this is not implemented the same cross-browser, and even if you can interrupt it, you can't (I believe) capture where the user was going, such that, in your socket closure callback, you could then forward them on.
An unideal compromise might be to use onbeforeunload
to at least prompt them to manually disconnect from the server. Many will; those that don't you can pick up with server-side detection.
Upvotes: 3