Ein EventSource (SSE) soll, um zu versuchen, um sich erneut auf unbestimmte Zeit?
Arbeite ich an einem Projekt zur Server-Sent-Events und haben einfach etwas Interessantes: Verbindungsverlust wird anders behandelt, zwischen Chrome und Firefox.
Auf Chrome 35 oder Opera 22, wenn Sie verlieren Ihre Verbindung zu den server, es wird versucht die Verbindung wiederherzustellen, auf unbestimmte Zeit alle paar Sekunden bis es erfolgreich ist. Auf Firefox 30, auf der anderen Seite, wird es nur einmal versuchen und dann müssen Sie entweder aktualisieren Sie die Seite, oder Sie behandeln das error-Ereignis ausgelöst und manuell verbinden.
Ich viel lieber den Weg von Chrome oder Opera funktioniert es, aber das Lesen http://www.w3.org/TR/2012/WD-eventsource-20120426/#processing-model, es scheint, als ob einmal die EventSource versucht wieder zu verbinden und nicht aufgrund eines Netzwerk-Fehler oder andere, sollte es nicht zu wiederholen, die Verbindung. Nicht sicher, ob ich Verständnis für die spec richtig, wenn.
Ich eingestellt wurde, erfordert Firefox-Nutzer, vor allem auf der Tatsache, dass Sie können nicht mehrere tabs mit einem event-Streams von der gleichen URL öffnen in Chrome, aber diese neue Erkenntnis wäre wahrscheinlich eher ein Problem. Obwohl, wenn Firefox verhält sich nach Skillung dann könnte ich auch arbeiten, um es irgendwie.
Edit:
Werde ich halten targeting für Firefox jetzt. Dies ist, wie ich bin-handling-verbindungen:
var es = null;
function initES() {
if (es == null || es.readyState == 2) { //this is probably not necessary.
es = new EventSource('/push');
es.onerror = function(e) {
if (es.readyState == 2) {
setTimeout(initES, 5000);
}
};
//all event listeners should go here.
}
}
initES();
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lese ich den standard, genauso wie Sie, aber selbst wenn nicht, es gibt browser-bugs zu berücksichtigen, Netzwerk, Fehler, Server, sterben, aber halten den socket öffnen, usw. Deshalb habe ich in der Regel fügen Sie ein keep-alive-oben auf dem re-connect, das SSE bietet.
Auf der client-Seite habe ich es mit ein paar globals und eine Hilfsfunktion:
Dann rufe ich
gotActivity()
obenconnect()
, und dann jedes mal, wenn ich eine Nachricht bekomme. (connect()
im Grunde nur funktioniert der Aufrufnew EventSource()
)Auf der server-Seite, es kann entweder spuckte einen timestamp (oder so) alle 15 Sekunden, auf der Oberseite des normalen Datenflusses, oder verwenden Sie einen timer selbst und spuckte einen timestamp (oder etwas), wenn der normale Datenfluss geht ruhig für 15 Sekunden.
Server-Side-Events, die anders funktioniert in allen Browsern, aber Sie alle die Verbindung zu schließen, die bei bestimmten Umständen. Chrome zum Beispiel schließt die Verbindung auf 502 Fehler, während ein server neu gestartet wird. So ist es am besten, um die Verwendung einer keep-alive-wie andere empfehlen oder wieder auf jeden Fehler. Keep-alive-nur in Verbindung bei einem angegebenen Intervall, die gehalten werden muss, um lange genug, um zu vermeiden überwältigend den server. Wiederherstellen der Verbindung zu jedem Fehler hat der geringst möglichen Verzögerung. Es ist jedoch nur möglich, wenn Sie einen Ansatz, der hält die server-Last auf ein minimum. Unten zeige ich einen Ansatz, der die Verbindung wiederherstellt, wird in angemessener Höhe.
Dieser code verwendet eine debounce-Funktion zusammen mit der reconnect-Intervall verdoppeln. Es funktioniert gut, Verbindung über 1 Sekunde, 4, 8, 16...bis zu einem maximum von 64 Sekunden, in dem Sie hält die Wiederholung mit der gleichen rate. Ich hoffe, dies hilft einige Leute.
Was ich bemerkt habe (bei Chrome zumindest) ist, dass, wenn Sie schließen Sie Ihre SSE Verbindung über
close()
Funktion, wird es versuchen nicht wieder.