Неожиданно длинная задержка при выполнении функции, заключенной в службу $ timeout AngularJS - PullRequest
0 голосов
/ 04 сентября 2018

У меня действительно странная проблема со службой $ timeout AngularJS, но давайте начнем с самого начала.

У меня есть веб-приложение, которое должно пинговать сервер каждые 3 секунды (более или менее). Итак, я использую сервис $ 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 минут. У веб-приложения есть много клиентов (они используют Chrome), но для большинства из них проблема не возникает. К сожалению, у меня нет доступа к рабочим станциям «проблемных» клиентов (виртуальным машинам), поэтому трудно сказать, есть ли проблема с длительной загрузкой DOM или что-то еще. Тем не менее, они не сообщили о каких-либо проблемах пользовательского интерфейса.

Журналы сервера IIS показывают, что запросы «/ ping» от этих клиентов даже не достигли сервера. Сначала я думал, что это может быть связано с функцией «Регулирование фоновых вкладок» в Chrome, но, насколько я знаю, клиенты поддерживают вкладку (с открытым веб-приложением) активной. Я знаю, что было бы хорошо зарегистрировать некоторые дополнительные данные для функции «sendPing ()», но я не могу сделать это прямо сейчас (все производственные развертывания остановлены из-за политики компании).

  • AngularJS версия: 1.0.7
  • Chrome версия: 68.0.3

Вопрос: Возможно ли, что это проблема AngularJS? Если так, в чем может быть причина?

1 Ответ

0 голосов
/ 18 сентября 2018

Вы делаете это неправильно. Вы создаете новый экземпляр $timeout каждый раз, когда вызываете функцию sendPing. Следовательно, ваше приложение сходит с ума. Вы должны разделить проблемы: например, имеют две функции: sendPing и createPingTimeout

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...