执行AngularJS的$ timeout服务中包装的函数时出现意外延迟

时间:2018-09-04 10:37:58

标签: angularjs

我对AngularJS的$ timeout服务有一个非常奇怪的问题,但让我们从头开始。

我有一个Web应用程序,应每3秒(或多或少)ping服务器一次。因此,我正在使用$ timeout服务,以便通过以下方式发送“ / ping”请求:

angular.module(…)
.factory('ping', ['$http', '$timeout', 'auth', function ($http, $timeout, auth) {
    return {
        init: function () {
            (function sendPing() {
                var pingInterval = 3000;

                if (auth.isLoggedIn()) {
                    $http
                        .post('/ping')
                        .success(function () {
                            $timeout(sendPing, pingInterval);
                        })
                        .error(function () {
                            $timeout(sendPing, pingInterval);
                        });
                } else {
                    $timeout(sendPing, pingInterval);
                }
            })();
        }
    };
}])
.run([ 'ping', … , function (ping, …) {
    //…
    ping.init();
    //…
}]);

它通常有效。但是,最近我进行了一次非常奇怪的操作-似乎有时(很少)发送“ / ping”请求之间的间隔从3秒增加到了2分钟。该Web应用程序有许多客户端(他们使用Chrome),但是对于大多数客户端而言,不会发生此问题。不幸的是,我无法访问“麻烦的”客户端的工作站(虚拟机),因此很难确定长时间的DOM加载是否存在问题或其他问题。但是,他们尚未报告任何UI问题。

IIS服务器日志显示来自那些客户端的“ / ping”请求甚至没有到达服务器。一开始,我以为这可能与Chrome的“背景标签限制”功能有关,但是据我所知,客户端使标签(带有打开的Web应用程序)保持活动状态。我知道最好为“ sendPing()”函数记录一些其他数据,但是我现在不能这样做(由于公司的政策,所有生产部署都已停止。)

  • AngularJS版本:1.0.7
  • Chrome版本:68.0.3

问题:甚至有可能是AngularJS问题吗?如果是这样,可能是什么原因?

1 个答案:

答案 0 :(得分:0)

您做错了。每次调用$timeout函数时,您都在创建sendPing的新实例。因此,您的应用程序疯了。您应该划分关注点:例如具有两个功能:sendPingcreatePingTimeout