停止同一函数内的间隔函数,然后恢复它

时间:2016-03-06 16:07:43

标签: javascript angularjs timer

我有一个$interval函数,每1秒执行一次。

基本上,该函数从本地存储中获取用户凭据,并检查凭据是否已过期。如果是,则继续刷新凭证。如果他们不是,那么它什么都不做。

这是我的功能:

$interval(function () {
    var credentials = JSON.parse(storage.fetch('credentials'));
    if (credentials && (credentials.expiration <= Date.now()) {
        session.refresh(credentials);
    }
}, 1000);

这里的问题是,一旦凭证到期,该函数将尝试刷新它们。但是这个任务需要一秒多的时间,因此下一个间隔时间点会看到凭据仍然过期并尝试再次刷新它们。这将至少持续3秒钟。

所以,我想可能在刷新我的凭据时取消刷新间隔,然后在我完成时恢复它:

var refreshing = $interval(function () {
   var credentials = JSON.parse(storage.fetch('credentials'));
   if (credentials && (credentials.expiration <= Date.now()) {
        session.refresh(credentials).then(function () {
             // How do I resume the interval function here ??
        });
        $interval.cancel(refreshing);
   }
}, 1000);

但是,正如您在上面的代码中所看到的,我不知道如何在promise回调中恢复该函数。

重新定义函数不是一个选项,因为我将面临同样的问题,因为我在这里有一个递归问题。

解决这个问题可以做些什么?

此外,如果这种间隔方法不是一个好的解决方案,我很高兴听到提示或最佳做法!。我目前刚刚接触AngularJS,所以我还在学习如何正确地做事。

2 个答案:

答案 0 :(得分:1)

当需要对setInterval / $interval进行某种程度的控制时,最佳做法是将其替换为递归setTimeout / $timeout

function checkCredentials() {
   var credentials = JSON.parse(storage.fetch('credentials'));
   if (credentials && (credentials.expiration <= Date.now()) {
        session.refresh(credentials).then(function () {
           return $timeout(checkCredentials, 1000);
        });
   } else {
        $timeout(checkCredentials, 1000);
   }
}
checkCredentials();

答案 1 :(得分:0)

你无法取消$ interval并检查是否刷新了progess。并且你不能每次都创建新的$ interval或$ timeout。

var progress = false;

$interval(function () {
    if(progress){
       return;
    }  

    var credentials = JSON.parse(storage.fetch('credentials'));
    if (credentials && (credentials.expiration <= Date.now()) {
        progress = true; 
        session.refresh(credentials).then(function(){
             progress = false;
        });
    }
});