EventSource
是 JavaScript 中用於處理伺服器傳送事件(Server-Sent Events, SSE)的介面。它允許網頁與伺服器之間建立一個持久的連線,伺服器可以透過這個連線向客戶端推送更新。
EventSource
通常用於需要實時更新資料的場景,比如實時通知、股票價格更新等。
基本用法
// 建立一個 EventSource 物件,並連線到指定的 URL
const eventSource = new EventSource('https://your-server.com/sse');
// 監聽訊息事件,當伺服器傳送訊息時觸發
eventSource.onmessage = function(event) {
console.log('New message:', event.data);
};
// 監聽連線開啟事件
eventSource.onopen = function() {
console.log('Connection to server opened.');
};
// 監聽錯誤事件
eventSource.onerror = function(event) {
console.error('Error occurred:', event);
if (eventSource.readyState === EventSource.CLOSED) {
console.log('Connection was closed.');
}
};
// 關閉連線
// eventSource.close();
關鍵概念和屬性
-
建構函式
new EventSource(url, [options])
url
: SSE 伺服器的 URL。options
: 可選引數,通常不需要。
-
主要事件
onmessage
: 當伺服器傳送訊息時觸發。onopen
: 當連線成功開啟時觸發。onerror
: 當連線出現錯誤或關閉時觸發。
-
readyState 屬性
EventSource.CONNECTING
(0
): 正在建立連線。EventSource.OPEN
(1
): 連線已建立,可以接收事件。EventSource.CLOSED
(2
): 連線已關閉,不會接收更多事件。
-
close() 方法
eventSource.close()
: 手動關閉連線。
示例解釋
new EventSource(sseAlarmUrl, { reconnectTime: 3000 });
這個示例建立了一個 EventSource
例項,連線到 sseAlarmUrl
指定的伺服器 URL,選項 { reconnectTime: 3000 }
表示在連線斷開後,客戶端會在 3000 毫秒(3 秒)後嘗試重新連線。
伺服器端實現(簡單示例)
在伺服器端,你需要支援 SSE。例如,使用 Node.js 實現 SSE:
const http = require('http');
http.createServer((req, res) => {
if (req.url === '/sse') {
res.writeHead(200, {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
});
setInterval(() => {
res.write(`data: ${new Date().toLocaleTimeString()}\n\n`);
}, 1000);
}
}).listen(3000);
console.log('Server running at http://localhost:3000/sse');
這個示例會每秒鐘向客戶端推送當前時間。
總結
EventSource
是一種輕量級的技術,用於從伺服器推送實時更新到客戶端。它透過簡單的介面讓你輕鬆實現實時資料流,特別適合需要頻繁更新的應用。