我有一个$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,所以我还在学习如何正确地做事。
答案 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;
});
}
});