如何创建一个每隔60秒调用另一个函数的函数?

时间:2015-03-28 11:14:05

标签: javascript angularjs

我有这个功能:

isAuthenticated = (): boolean => {
    xxx
};

我正在使用AngularJS,我想知道如何创建一个像

这样的函数
keepCheckingAuthentication()

那将每隔60秒调用一次Authenticated()函数吗?

5 个答案:

答案 0 :(得分:2)

有一个setInterval函数可以调用ms中给定时间间隔的任何代码:

var intervalID = setInterval(function() { console.log('Works!') }, 1000);

稍后您可以使用clearInterval(intervalID)取消计时器。

答案 1 :(得分:2)

如果isAuthenticated可以修改为实际发出请求调用服务器以检查身份验证,并且可以返回一个解析或拒绝的承诺,那么我会做

var keepCheckingAuthentication = function() {
  return isAuthenticated().catch(angular.noop).then(function(isAuth) {
    // Can do something different if isAuth == false
    return $timeout(keepCheckingAuthentication, 60 * 1000);
  });
});

请注意对catch的通话。这有效地将任何拒绝转换为成功,因此在每种情况下都会运行下一个then回调。

使用类似这样的东西而不是$setInterval意味着来自服务器的响应之间总是有60秒,而不是请求。在较慢的连接或过载的服务器上,这意味着添加到重载连接或服务器的可能性较低,因为您确定先前的请求已完成,然后再发送另一个请求。

答案 2 :(得分:1)

你可以使用$interval函数(AngularJS中window.setInterval()的包装器)吗?

$interval函数的文档为here

在您的情况下keepCheckingAuthentication()是功能,您可以根据需要调整其他参数吗?这有帮助吗?

示例:

$interval(myFunctionAtInterval, 5000) // Scheduled for every 5 seconds, for instance

funtion myFunctionAtInterval() {...}

答案 3 :(得分:1)

我倾向于尽可能地避免setInterval,即总是(保罗爱尔兰人在video中谈到这一点)。

我所做的是将setTimeout包装在递归调用自身的函数中(条件允许我轻松停止,或让数据决定何时不再需要)。

var condition = true;

$scope.count = 1;

function myFunc(){
   $scope.count += 1;
 }

var timer = function(){
  myFunc();
  if( condition ){
    $timeout(timer, 1000);
  }    
};

timer();

我在这里使用角度$timeout,因为它总是被建议。 一个demo

答案 4 :(得分:1)

使用$ interval.this代码将帮助您:

var callefunc=function() {
    console.log('hey i am calle');
}

$scope.caller=function(){
    var stop = $interval(callefunc, 1000);
}

如果你想以1秒的间隔启动函数caller,你可以调用callefunc函数。