2017-12-18 26 views
1

일단 사용자가 로그 아웃하면 서버 - 보낸 - 이벤트를 프로그래밍 방식으로 닫고 싶습니다. 그러나 사용자가 다시 로그인 할 때 브라우저는 SSE 연결의 한계에 도달했기 때문에 더 이상 https 요청을 실행하지 않습니다.`close() '를 호출 함에도 불구하고 서버 - 보낸 이벤트 연결이 닫히지 않았습니다.

나는 이벤트 청취에 EventSource을 사용하고 있습니다.

var eventSource; 
function onChange(accountId:string, callback){ 
    var url = "..."; 

    eventSource = new EventSource(url); 

    if(eventSource){ 
     eventSource.addEventListener("put", callback); 
    } 
} 

function close(){ 
    this.eventSource.close() 
} 

내가 브라우저의 네트워크 연결을 관찰했다, 나는 연결이 여전히 존재 실현 :
이것은 내 연결을 닫는 방법이다. Timing의 출력은 Caution: request is not finished yet!입니다. 제한된 연결 수 때문에 다음 이벤트 스트림이 정지합니다.

EventSource이 이와 같이 작동하도록 설계되어 있는지 확실하지 않지만 많은 사람들이 동일한 시나리오를 사용하지 않기 때문에이 문제와 관련된 내용을 찾을 수 없습니다.
브라우저 (크롬)에서 페이지를 새로 고침 할 때마다 기존의 모든 연결이 닫히지 만 문제를 해결하기 위해 페이지를 다시로드하지 않으려합니다.

답변

0

당신이 생각하는대로 this.eventSource을 참조하십시오. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this 이벤트 처리기에서 호출 된 경우 전역 범위가 아닙니다.

xxx.close()을 호출 한 후에 xxx을 null로 설정하십시오. (문제는 아닐지 모르지만 가비지 수집을 돕고 버그를 찾는 데 도움이 될 수 있습니다.)

문제의 3 가지 아이디어로, 전역에 내장 된 개체와 같은 이름을 사용하지 마십시오. 나는 보통 내 이벤트 소스 객체에 es을 사용합니다.

+0

'this'가 정확한 범위를 가리키는 지 확인하고 'eventSource'를 닫은 후에'eventSource'를 설정했지만 연결은 계속 유지됩니다 .. Btw, typescript (ionic3) 및 npm을 사용하여'eventSource'를 설치했는데 효과가 있습니까? –

+0

@MerveSahin 처음 두 개를 없애 버린 것처럼 보이지만 (여기서는 선택 사항이고 쉽게 잘못 될 수 있으므로'this '를 제거 하겠지만),'es'로만 객체의 이름을 바꾸려고 했습니까? 나는 ionic3으로 충분히 익숙하지 않다. npm으로 설치되었다고 할 때, 백엔드 또는 프런트 엔드를 의미합니까? 브라우저 기본 제공 EventSource에 대한 래퍼라면 문제가 될 수 있습니까? –