2017-12-18 12 views
1

Ich möchte die Server-Sent-Ereignisse programmatisch schließen, sobald ein Benutzer abmeldet. Allerdings, wenn der Benutzer sich anmeldet zurück, wird der Browser keine https-Anfragen mehr ausführen, da sie ihre Grenze von SSE-Verbindungen erreicht hat.Server-Sent Event-Verbindungen werden nicht trotz Aufruf `schließen geschlossen()`

Ich verwende EventSource für Veranstaltungen zu hören.
Dies ist, wie ich meine Verbindungen schließen:

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

    eventSource = new EventSource(url); 

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

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

Als ich im Browser die Netzwerkverbindungen zu beobachten, erkannte ich die Verbindung noch besteht. Der Ausgang in Timing ist: Caution: request is not finished yet! die folgenden Ereignis-Ströme werden abgewürgt aufgrund der begrenzten Anzahl von Verbindungen.

Ich bin mir nicht sicher, ob EventSource entworfen wird, um so zu verhalten, aber ich konnte nichts in Bezug auf dieses Problem finden, da viele Leute nicht das gleiche Szenario haben.
Jedes Mal, wenn ich die Seite in meinem Browser neu lade (chrome), sind alle bestehenden Verbindungen geschlossen, aber ich möchte die Seite nicht neu laden, um dieses Problem zu umgehen.

Antwort

0

Vergewissern Sie sich, dass this.eventSource sich bezieht, was Sie denken, es ist. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this Wenn es von einem Ereignishandler aufgerufen wird, ist dies nicht der globale Gültigkeitsbereich.

Nach xxx.close() Aufruf gesetzt xxx auf null. (Ich bezweifle, dass das das Problem ist, aber es kann die Garbage Collection helfen, und hilft auch Fehler zu finden.)

Als eine dritte Idee des Problems, vermeiden Globals den gleichen Namen wie integrierte Objekte. Normalerweise verwende ich es für meine Ereignisquellenobjekte.

+0

Ich stellte sicher, dass 'this 'sich auf den richtigen Bereich bezog und die' eventSource' auf 'undefined' stellte, nachdem sie geschlossen wurde, aber die Verbindung besteht immer noch. Übrigens benutze ich Typoskript (ionic3) und installiert 'eventSource' mit npm, kann es einen Effekt haben? –

+0

@MerveSahin Da Sie die ersten beiden scheinbar eliminiert haben (obwohl ich das 'This. 'trotzdem entfernen würde, da es hier optional ist und so leicht schief gehen kann), haben Sie versucht, das Objekt in' es' umzubenennen? Ich bin nicht genug vertraut mit ionic3 zu kommentieren; wenn du mit npm installierst, meinst du das auf dem back-end oder dem front-end? Wenn es ein Wrapper um die integrierte EventSource des Browsers ist, dann könnte das das Problem sein? –

Verwandte Themen