如何在Angularjs中优化实时通知的$ interval?

时间:2015-10-29 14:50:14

标签: javascript php angularjs node.js

我正在社交网站上工作。我使用以下代码来实时显示用户的总通知数。

代码:

    function load_notifications(){
        $http.get('http://localhost:3000/load').success(function(data){
            $scope.totalNotify = data.total;
        });
    };
load_pictures();
$interval(function(){
        load_notifications();
    },300);

基本上,此代码以给定的间隔连续检查数据库,如果有一些更改,则更新$ scope值。但是当我尝试在不同的浏览器中与两个不同的用户进行检查时,由于轮询请求,它会扼杀浏览器。

有没有办法改进这种方法或有任何其他更好的选择? 我正在使用PHP和AngularJS构建我的应用程序。但我也对这个模块的其他选项持开放态度。

4 个答案:

答案 0 :(得分:3)

这应该使用网络套接字来完成,而不是轮询ajax请求。

JS:AngularJS and WebSockets beyond

PHP:How to create websockets server in PHP

具体来说,对于使用PHP的网络套接字,我会使用Rachet

PHP的起点是:http://socketo.me/docs/hello-world

这个hello world教程向您展示了用于通过Rachet进行交互的基本javascript和PHP。

答案 1 :(得分:2)

awaitingResponse = false;

function load_notifications() {
    if(!awaitingResponse) {
        awaitingResponse = true;

        $http.get('http://localhost:3000/load').then(function(response) {
            $scope.totalNotify = response.data.total;
            awaitingResponse = false;
        }, function() {
            awaitingResponse = false;
        });
    }
}

load_pictures();
$interval(load_notifications, 3000);

答案 2 :(得分:2)

收到答复后你可以等待300毫秒,如下所示:

function load_notifications(){
    $http.get('http://localhost:3000/load').success(function(data){
        $scope.totalNotify = data.total;
        setTimeout(function() {
            load_notifications();
        }, 300);
    });
};
load_pictures();
load_notifications();

答案 3 :(得分:0)

如果您只使用websockets,则每次都需要运行查询以确定是否有任何更改。我建议使用实时数据库。

您可以RethinkDB使用FirebaseAngularFire。这些是实时数据库,并会在任何这些字段发生更新时通知您。 如果您使用RethinkDB,那么您还需要实现websocket解决方案来通知浏览器。