我对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问题吗?如果是这样,可能是什么原因?
答案 0 :(得分:0)
您做错了。每次调用$timeout
函数时,您都在创建sendPing
的新实例。因此,您的应用程序疯了。您应该划分关注点:例如具有两个功能:sendPing
和createPingTimeout