天天看點

angularjs 實作輪詢

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();           

繼續閱讀