客户端 API

EventSource 对象

SSE 的客户端 API 部署在EventSource对象上。下面的代码可以检测浏览器是否支持 SSE。

  1. if ('EventSource' in window) {
  2. // ...
  3. }

使用 SSE 时,浏览器首先生成一个EventSource实例,向服务器发起连接。

  1. var source = new EventSource(url);

上面的url可以与当前网址同域,也可以跨域。跨域时,可以指定第二个参数,打开withCredentials属性,表示是否一起发送 Cookie。

  1. var source = new EventSource(url, { withCredentials: true });

readyState 属性

EventSource实例的readyState属性,表明连接的当前状态。该属性只读,可以取以下值。

  • 0:相当于常量EventSource.CONNECTING,表示连接还未建立,或者断线正在重连。
  • 1:相当于常量EventSource.OPEN,表示连接已经建立,可以接受数据。
  • 2:相当于常量EventSource.CLOSED,表示连接已断,且不会重连。
  1. var source = new EventSource(url);
  2. console.log(source.readyState);

url 属性

EventSource实例的url属性返回连接的网址,该属性只读。

withCredentials 属性

EventSource实例的withCredentials属性返回一个布尔值,表示当前实例是否开启 CORS 的withCredentials。该属性只读,默认是false

onopen 属性

连接一旦建立,就会触发open事件,可以在onopen属性定义回调函数。

  1. source.onopen = function (event) {
  2. // ...
  3. };
  4. // 另一种写法
  5. source.addEventListener('open', function (event) {
  6. // ...
  7. }, false);

onmessage 属性

客户端收到服务器发来的数据,就会触发message事件,可以在onmessage属性定义回调函数。

  1. source.onmessage = function (event) {
  2. var data = event.data;
  3. var origin = event.origin;
  4. var lastEventId = event.lastEventId;
  5. // handle message
  6. };
  7. // 另一种写法
  8. source.addEventListener('message', function (event) {
  9. var data = event.data;
  10. var origin = event.origin;
  11. var lastEventId = event.lastEventId;
  12. // handle message
  13. }, false);

上面代码中,参数对象event有如下属性。

  • data:服务器端传回的数据(文本格式)。
  • origin: 服务器 URL 的域名部分,即协议、域名和端口,表示消息的来源。
  • lastEventId:数据的编号,由服务器端发送。如果没有编号,这个属性为空。

onerror 属性

如果发生通信错误(比如连接中断),就会触发error事件,可以在onerror属性定义回调函数。

  1. source.onerror = function (event) {
  2. // handle error event
  3. };
  4. // 另一种写法
  5. source.addEventListener('error', function (event) {
  6. // handle error event
  7. }, false);

自定义事件

默认情况下,服务器发来的数据,总是触发浏览器EventSource实例的message事件。开发者还可以自定义 SSE 事件,这种情况下,发送回来的数据不会触发message事件。

  1. source.addEventListener('foo', function (event) {
  2. var data = event.data;
  3. var origin = event.origin;
  4. var lastEventId = event.lastEventId;
  5. // handle message
  6. }, false);

上面代码中,浏览器对 SSE 的foo事件进行监听。如何实现服务器发送foo事件,请看下文。

close() 方法

close方法用于关闭 SSE 连接。

  1. source.close();