http協定的特性
每個請求都是隔離的,并且在浏覽器沒有發起請求前伺服器無法發送respone給到用戶端。
針對前端消息展示業務,消息應實時擷取,是以給出了輪詢。
【1】http輪詢分為長輪詢、短輪詢
1)、長輪詢
請求的時候操作資料庫,如果請求有資料,背景立刻響應,沒有資料請求會停留一段時間,在這段時間過後如果還沒有資料到達則以空資料的形式響應http請求;若浏覽器收到的資料為空,會再次發送同樣的http請求到server;
缺點:在沒有資料傳回的時候,長輪詢會停留,這個操作會造成伺服器資源浪費
例:目前存在1000使用者,這1000使用者都存在使用這個輪詢場景,并且很不辛這1000使用者都沒有請求到資料,這導緻了伺服器挂着這1000個請求線程。
2)、短輪詢
http 短輪詢是 server 收到請求 不管是否有資料到達都直接響應http 請求;如果浏覽器收到的資料為空,則隔一段時間,浏覽器又會發送相同的http請求到server 以擷取資料響應;
缺點:消息互動的實時性較低(server端到浏覽器端的資料回報效率低);
http 長輪詢 和 短輪詢的異同
1)相同點:當server 的資料不可達時,基于http長輪詢和短輪詢 的http請求,都會 停留一段時間;
2)不同點:http長輪詢是在伺服器端的停留,而http 短輪詢是在 浏覽器端的停留;
3)性能總結:從這裡可以看出,不管是長輪詢還是短輪詢,都不太适用于用戶端數量太多的情況,因為每個伺服器所能承載的TCP連接配接數是有上限的,這種輪詢很容易把連接配接數頂滿;
————————————————
使用 $interval 實作短輪詢
是對原生
setInterval
的一種封裝,它會在每次方法調用後自動的執行`$apply``
api是這樣的:
$interval(fn, delay, [count], [invokeApply], [Pass]);
fn是目标方法
delay 是延遲時間,機關是毫秒
count 是一共循環多少次
invokeApply 是指是否調用$apply方法,預設true
Pass是方法運作是傳的參數
在controller加入以下代碼
var stop;
$scope.$on('$ionicView.beforeLeave', function() {
$interval.cancel(stop);//離開頁面後停止輪詢
})
//輪詢
stop = $interval(function() {
$http.get('/staffMessage/staffMessageList?pageIndex=1&pageSize=10')
.success(function(result) {
$scope.data = result;
}).finally(function() {});
}, 6000);
在controller注入一下代碼:
$scope.orderMsgSum = 0;
$scope.queryOrderMsgSum = function(){
debugger
var param = $scope.$sessionAttrs.loginUser;
$http.post($config.ctx + '/msgOrderTask/orderMsgNum',param).success(function(data){
if (data.success != undefined && data.success == true) {
$scope.orderMsgSum = data.msg;
}
});
};
$scope.getOrderMsgSum = function() {
$scope.queryOrderMsgSum();
var param = $scope.$sessionAttrs.loginUser;
var msgOrderNumInterval = setInterval(function(){
$http.post($config.ctx + '/msgOrderTask/orderMsgNum',param).success(function(data){
if(data.errorMessages){
window.clearInterval(msgOrderNumInterval);
}
if (data.success != undefined && data.success == true) {
$scope.orderMsgSum = data.msg;
}
});
},10000);
}
$scope.getOrderMsgSum();