Page 256 - Web性能权威指南
P. 256

的 JavaScript 事件监听器即可:

                   var source = new EventSource("/path/to/stream-url"); ➊

                   source.onopen = function () { ... }; ➋
                   source.onerror = function () { ... }; ➌

                   source.addEventListener("foo", function (event) { ➍
                     processFoo(event.data);
                   });
                   source.onmessage = function (event) {  ➎
                     log_message(event.id, event.data);
                     if (event.id== "CLOSE") {
                       source.close(); ➏
                     }
                   }

               ➊ 打开到流终点的 SSE 连接
               ➋ 可选的回调,建立连接时调用
               ➌ 可选的回调,连接失败时调用
               ➍ 监听 "foo" 事件,调用自定义代码
               ➎ 监听所有事件,不明确指定事件类型
               ➏ 如果服务器发送 "CLOSE" 消息 ID,关闭 SSE 连接


                          EventSource 可以像常规 XHR 一样利用 CORS 许可及选择同意机制,实
                          现客户端到远程服务器的流式事件数据传输。


               这就是客户端 API 的全部。浏览器会帮我们处理一切:替我们协商建立连接,接收
               并递增地解析数据,标识消息的范围,最终触发 DOM 事件。EventSource 接口的设
               计就是让开发者只关注业务逻辑:打开新连接、处理接收到的事件通知,然后在完
               事儿时终止流。


                          SSE 实现了节省内存的 XHR 流。与原始的 XHR 流在连接关闭前会缓冲接
                          收到的所有响应不同,SSE 连接会丢弃已经处理过的消息,而不会在内存
                          中累积。


               值得一提的是,EventSource 接口还能自动重新连接并跟踪最近接收的消息:如果连
               接断开了,EventSource 会自动重新连接到服务器,还可以向服务器发送上一次接收
               到的消息 ID,以便服务器重传丢失的消息并恢复流。



               244   |   第 16 章
   251   252   253   254   255   256   257   258   259   260   261