我正在开发一个利用服务器发送事件的项目,最近遇到了一个有趣的问题:在Chrome和Firefox中处理连接丢失的方式不同。
在Chrome 35或Opera 22上,如果您失去与服务器的连接,浏览器会每隔几秒钟无限次地尝试重新连接,直到成功为止。另一方面,在Firefox 30上,它只会尝试一次,然后您必须刷新页面或处理引发的错误事件并手动重新连接。
我非常喜欢Chrome或Opera的做法,但是阅读http://www.w3.org/TR/2012/WD-eventsource-20120426/#processing-model,似乎一旦EventSource尝试重新连接并由于网络错误或其他原因失败,就不应该重试连接。不确定自己是否正确理解了规范。
我曾经打算要求用户使用Firefox,主要是因为您不能在Chrome上同时打开来自相同URL的多个选项卡,但这个新发现可能更加问题。不过,如果Firefox按照规范行事,那么我可能需要绕过它。
编辑:
目前我仍将针对Firefox进行开发。以下是我处理重新连接的方法:
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();