2012-08-07 3 views
2

일반적으로 이것은 중요하지 않으며 내 상황에 너무 중요하지 않을 수도 있습니다. 그러나이를 구현하는 합리적인 방법이 있는지 알고 싶습니다.페이지 언로드 전에 코드가 항상 호출되도록하는 방법

내 페이지가 자동으로 웹 소켓 연결을 엽니 다. 더 나은 클라이언트가되기 위해서는 클라이언트가 자체적으로 정리하고 페이지가 언로드되기 전에 websocket을 닫고 싶습니다.

페이지가로드 될 때 브라우저가 나를 위해 close()을 호출 할 수있는 예지력을 가졌지 만, 그렇지 않은 경우 브라우저에서 onbeforeunload 메시지 (일부 등)를 활용하여 어떻게 "최종 정리 "(C에서 atexit()과 다르지 않음)?

어떤 이유로 든 내 클라이언트가 내 websocket 서버에 "exiting"메시지를 보내길 원한다고 가정 해 봅시다. 실제로 페이지를 언로드에 socket.onclose 콜백 화재 이전

$(window).on('beforeunload', function() { 
    websocket.close(); // websocket is a WebSocket 
}); 

을하지만 (그것이?) close() 실제로 비동기 호출 가정하자 나는 에 있는지 확인합니다 :

지금은이 작업을 수행 할 수 있습니다 ! 이 작업을 수행 할 수 있습니까?

+0

서버를 제어하는 ​​경우 n 분마다 클라이언트 측 하트 비트를 요구할 수 있습니다. 하트 비트가 서버에 수신되지 않으면 서버는 소켓이 닫혀 브라우저가 고갈 된 클라이언트 소켓을 정리합니다 약. – jfriend00

+0

@ jfriend00이 문제를 해결할 수있는 가장 좋은 방법 인 것 같습니다. 'onbeforeunload' 내부에있는'close()'가 트릭을하고있는 것처럼 보입니다. –

+0

나는 모든 브라우저에서 작동하는'close()'를 기대할 수는 없다고 생각하지만, 거기에 해를 입히는 데 아무런 해가 없다. 하트 비트는 창 폐쇄를 알리는 브라우저 버그를 포함한 모든 경우를 포함합니다. – jfriend00

답변

1

최신 브라우저에서 비동기 호출이 완전히 실행되는지 확인하는 확실한 방법이 없습니다. 이전 버전은 while 루프로 유지 될 수 있지만 현재 브라우저는 모든 프로세스를 중단하고 계속 진행합니다. 이유는 사용자 경험이 빠르기를 원한다는 것입니다.

+0

언로드를 유지하기 위해 바쁜 루프를하는 것은 적절한 해결책이 아닙니다. –

+1

@StevenLu는 유일한 해결책이었습니다. :) – epascarello

1
window.onunload=function(){ 
//your code here 
} 

나는 우리가 이것을 가지고 있다고 생각한다.

+0

이것은 비동기 적이 지 않은 것들에 충분하지만 내 'websocket.onclose'가 실행되었는지 (비동기식인지) 충분하지 않아야합니다. 아마도 해결책이 없을 것입니다. –

관련 문제