Cydonia7
Cydonia7

Reputation: 3826

Force a javascript code to be synchronous

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

Answers (5)

scanales
scanales

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

Cydonia7
Cydonia7

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

Robin Maben
Robin Maben

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

Mitya
Mitya

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

Ricola3D
Ricola3D

Reputation: 2442

Maybe you could try using the "beforeunload" event instead of "unload", like there, but I don't think there is a way to delay the window closing by another way.

Upvotes: 0

Related Questions