你知道反向ajax嗎?知道反向ajax是怎麼實現的嗎?都不知道,還不快來看這篇文章,介紹了關於反向ajax的詳細資料。下面開始閱讀本篇
什麼是反向ajax
反向 Ajax (Reverse Ajax) 本質上則是這樣的一種概念:能夠從伺服器端向用戶端發送資料。在一個標準的 HTTP Ajax 請求中,資料是發送給伺服器端的,反向 Ajax 可以某些特定的方式來類比發出一個 Ajax 請求,這樣的話,伺服器就可以儘可能快地向用戶端發送事件(低延遲通訊)。
反向ajax實現方式
1. 輪詢 (Polling)
輪詢其實是一種最笨的實現反向ajax的方法:用javascript在用戶端定時發送ajax請求。
setInterval(function() { $.getJSON('events', function(events) { console.log(events); }); }, 2000);12345
為了儘快地獲得伺服器端事件,輪詢的間隔(兩次請求相隔的時間)必須儘可能地小。這樣做的缺點就十分明顯:如果間隔減小的話,用戶端瀏覽器就會發出更多的請求,這些請求中的許多都不會返回任何有用的資料,而這將會白白地浪費掉頻寬和處理資源。
2.PiggyBack(捎帶輪詢)
捎帶輪詢是一種比輪詢更加聰明的做法,因為它會刪除掉所有非必需的請求(沒有返回資料的那些)。
它是一種半主動的方式,也就是說還是由Browser主動發出請求,但是每次請求的響應中除了當次的響應之外,還會把上次請求以來已經發生的變化同時發給Browser。
也就是說,當次請求的更新會搭載到下一次請求的響應一併發回。這樣,在Browser的感覺就好像上一次請求又有了更新。但是這種感覺取決於Browser向Server發出請求的頻率。如果,第二次請求遲遲沒有發出,那麼上一次的更新就不會取到。
3. Comet(伺服器推)
這是一種基於 HTTP 長串連的“伺服器推”技術。
實現方式主要有下面兩種:
1)HTTP 流(HTTP Streaming)
在頁面裡嵌入一個隱蔵iframe,將這個隱蔵iframe的src屬性設為對一個長串連的請求或是採用xhr請求,伺服器端就能源源不斷地往用戶端輸入資料。
優點:訊息即時到達,不發無用請求;管理起來也相對方便。
缺點:伺服器維護一個長串連會增加開銷。
執行個體:Gmail聊天
<script type="text/javascript"> $(function () { (function iframePolling() { var url = "${pageContext.request.contextPath}/communication/user/ajax.mvc?timed=" + new Date().getTime(); var $iframe = $('<iframe id="frame" name="polling" style="display: none;" src="' + url + '"></iframe>'); $("body").append($iframe); $iframe.load(function () { $("#logs").append("[data: " + $($iframe.get(0).contentDocument).find("body").text() + " ]<br/>"); $iframe.remove(); // 遞迴 iframePolling(); }); })(); });</script>
2)HTTP 長輪詢(HTTP Long Polling)
這種情況下,由用戶端向伺服器端發出請求並開啟一個串連。這個串連只有在收到伺服器端的資料之後才會關閉。伺服器端發送完資料之後,就立即關閉串連。用戶端則馬上再開啟一個新的串連,等待下一次的資料。(想看更多就到topic.alibabacloud.comAJAX開發手冊欄目中學習)
優點:在無訊息的情況下不會頻繁的請求,耗費資源小。
缺點:伺服器hold串連會消耗資源,返回資料順序無保證,難於管理維護。
執行個體:WebQQ、Hi網頁版、Facebook IM。
<script type="text/javascript"> $(function () { (function longPolling() { $.ajax({ url: "${pageContext.request.contextPath}/communication/user/ajax.mvc", data: {"timed": new Date().getTime()}, dataType: "text", timeout: 5000, error: function (XMLHttpRequest, textStatus, errorThrown) { $("#state").append("[state: " + textStatus + ", error: " + errorThrown + " ]<br/>"); if (textStatus == "timeout") { // 請求逾時 longPolling(); // 遞迴調用 // 其他錯誤,如網路錯誤等 } else { longPolling(); } }, success: function (data, textStatus) { $("#state").append("[state: " + textStatus + ", data: { " + data + "} ]<br/>"); if (textStatus == "success") { // 請求成功 longPolling(); } } }); })(); }); </script>
本篇文章到這就結束了(想看更多就到topic.alibabacloud.comAJAX使用手冊欄目中學習),有問題的可以在下方留言提問。