angularjs $ максимальное значение тайм-аута

Я использую angularjs и, в частности, службу $timeout (оболочку для setTimeout). Это работает следующим образом:

 angular.module('MyApp').controller('MyController', ['$scope', '$timeout',
     function($scope, $timeout) {

        $scope.millisecondsLater = 3000000000;
        $timeout(function(){
           console.log('it\'s been ' + $scope.millisecondsLater + ' later');
        }, $scope.millisecondsLater);

    }
 ]);

когда этот контроллер создается, функция в тайм-ауте вызывается немедленно. Но если я установлю:

  $scope.millisecondsLater = 2000000000; 

он, похоже, не вызывается, как и ожидалось, потому что это (через 2000000 секунд). И, конечно, если я установлю $scope.millisecondsLater = 2000, обратный вызов будет вызван через 2 секунды.

Кажется, что $timeout имеет максимальное значение где-то между 3000000000 и 2000000000, и вместо того, чтобы никогда не вызывать обратный вызов, он вызывается немедленно (по крайней мере, для хрома). Кто-нибудь сталкивался с этим раньше? и как вы чисто разрешили это без кучи жестко запрограммированных if ‹ 2000000000 проверок всякий раз, когда используются тайм-ауты?

Заранее спасибо и будем признательны за любое понимание!


person Aaron    schedule 21.02.2014    source источник


Ответы (1)


Я не думаю, что эта проблема характерна не для службы $timeout Angular, а для функции setTimeout, которая существует в обычном JavaScript (поскольку $timeout в любом случае эффективно обертывает setTimeout).

Максимальное значение, которое может принимать setTimeout, — это 32-битное целое число (т. е. 2 147 483 647). Все, что выходит за рамки, очевидно, приведет к неожиданному поведению. Возможно, разбить ваши задержки на более мелкие куски?

person miqh    schedule 21.02.2014
comment
Я просто пошел дальше и добавил if($scope.millisecondsLater ‹ 2147483647){ { // выполнить тайм-аут } К сожалению, это игнорирует большие тайм-ауты. Но так как 2147483 секунды это как 25 день, я не против... спасибо за ответ! и решение разбить ответ на куски и создать рекурсивные тайм-ауты было бы отличной оболочкой, которую я реализую в какой-то момент. - person Aaron; 21.02.2014