2014-02-21 2 views
4

Я использую angularjs и, в частности, $ timeout service (обертка на 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, callback будет вызван через 2 секунды позже.

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

Заранее спасибо, и любая информация была бы принята с благодарностью!

ответ

5

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

Максимальное значение setTimeout может принимать 32-битовое целое число (то есть 2147483647). Все, что за пределами, очевидно, приведет к неожиданному поведению. Возможно, нарушите ваши задержки на более мелкие куски?

+0

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