ajax技術是一種從客戶端向服務器請求數據的技術,而若是是要將數據從服務器主動推向客戶端,那麼就須要更加高級的數據傳輸技術,這些技術主要是爲了處理一些在客戶端展現服務器上實時變化的數據,數據的變化只有服務端知道,而客戶端是須要在服務端更新數據以後立刻將新數據展現到頁面,這個時候使用ajax技術就很難作到這一點了.前端
短輪詢也稱爲傳統輪詢,是一種比較古老的方法,這個方法的本質就是,客戶端使用一個定時器,每隔必定的時間就向服務端發送ajax請求,將服務端的最新的數據請求回來,可是這種方法很明顯是有很大的弊端的.web
實現Comet的方式總共有兩種: 長輪詢和流.ajax
長輪詢實際上就是把短輪詢顛倒了一下,客戶端發起一個請求到服務器,而後服務器一直保持鏈接打開,直到數據更新有數據能夠發送,發送完數據以後,瀏覽器關閉鏈接,隨即又發起一個新的請求,這個過程在頁面打開期間接二連三.小程序
長輪詢和短輪詢瀏覽器在接受到數據以前,都會向服務器發送請求,兩者的區別在於服務器什麼時候發送請求,長輪詢的優點是能夠減小無用的請求,同時也能實現數據的實時更新,輪詢最大一個優點就是兼容性很是的好,全部瀏覽器都支持.微信小程序
流不一樣於上面兩種輪詢,由於他在頁面的整個生命週期內只使用一個HTTP鏈接.由瀏覽器發送一個請求,而服務器一直保持鏈接打開,而後週期性地向瀏覽器發送數據.瀏覽器
HTTP流的關鍵在於全部的服務端語言都支持打印到輸出而後刷新的功能,在客戶端只須要經過監聽readystatechange事件以及readyState的值的變化,隨着不斷的從服務器接受數據,readyState的值會週期性的變爲3,當readyState的值爲3的時候,responseText屬性中會保存所接受到的全部數據,這個時候須要比較以前的數據,來肯定所接受到的最新的數據.服務器
下面是使用XHR對象實現HTTP流的代碼:微信
function createStreamingClient(url, progress, finished) { let xhr = new XMLHttpRequest(), received = 0 xhr.open('get', url, true) xhr.onreadystatechange = function () { let result if (xhr.readyState === 3) { result = xhr.responseText.substring(received) received += result.length progress(result) } else if (xhr.readyState === 4) { finished(xhr.responseText) } } xhr.send(null) return xhr }
SSE(服務器發送事件),它的API用於建立到服務器的單向鏈接,服務器經過這個鏈接能夠發送任意數量的數據.這裏須要注意的是:服務器響應的MIME類型必須爲text/event-stream
,並且是瀏覽器中JavaScript API可以解析的格式輸出.SSE支持短輪詢,長輪詢,和HTTP流.框架
let source = new EventSource(url)
傳入的url必須和建立對象的頁面同源.event.data
中.Web Sockets 的做用是在一個單獨的持久鏈接上提供雙向通訊.在建立了Web Sockets 以後,會有一個HTTP請求發送到瀏覽器.取得服務器響應以後,創建的鏈接會從HTTP協議變成Web Socket 協議.socket
使用Web Socket 協議的好處在於可以在客戶端和服務器之間發送很是少許的數據,所以Web Sockets 很是適合移動應用.
let socket = new Websocket(url)
.event.data
屬性中.WebSockets對象不支持DOM2級事件監聽器,必須使用DOM0級語法來定義每一個事件的處理函數.
【完】
做者簡介:鄭佳歡,蘆葦科技web前端實習生,公司做品:口紅挑戰網紅小遊戲、服務端渲染官網。擅長網站建設、公衆號開發、微信小程序開發、小遊戲、公衆號開發,專一於前端領域框架、交互設計、圖像繪製、數據分析等研究。 一塊兒並肩做戰: zhengjiahuan@talkmoney.cn 訪問 www.talkmoney.cn 瞭解更多
做者:廣州蘆葦科技web前端
連接:http://www.javashuo.com/article/p-xegqxvrs-dq.html
來源:掘金
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。